MVC3快速搭建Web应用(二)

上一篇文章发布后MVC3快速搭建Web应用(一),自己又仔细读了数遍,感觉一是文笔太差,二是描述逻辑比较混乱,客观原因是涉及到东西其实蛮多的,那三个步骤不可能在一篇短短的文章中就可以描述清楚。此篇笔者将尽量更加详尽一些。另外需要说明一点的是,本文默认读者:

熟悉ASP.NET MVC;Razor语法;熟悉javascript;实体框架。

Web应用不像winform应用,要想让用户得到更流畅更舒适的体验,方法之一就是模拟winform的窗口操作,使用户在浏览器中也能像桌面一样舒服。在界面框架方面我们有大家最熟悉的jquery ui,有Ext等等,经过一系列的筛选,我们最终决定使用easyui,文档教程例子都比较全面的一个js ui框架。首先我们来看看用到的js文件

 
 
 
 
  1.  jquery主文件
  2.  easy ui主文件
  3.  校验组件 
  4.  表单组件
  5.  easyui的中文化
  6.  校验组件的中文化

我们把它添加到mvc的Shared/_Layout.cshtml中。这样我们的项目所有Layout=null的视图都拥有了easyui支持。

在MVC3中,当你右键添加一个控制器时,向导会让你选择:

其中模版我们选择使用实体框架并生成相关actions与views,Model选择你实体框架中对应的表名(类名),DataContext选择上下文类

Views引擎选择Razor,高级选项里的两个勾都去掉,因为我们不需要引用内置的脚本库,也不需要选择layout(不选择layout,MVC默认该view使用Shared/_Layout.cshtml,也就是刚才我们添加js文件link的那个文件)。

确认上一篇中你下载的t4模版放进了它应该存在的地方(最好备份一下原始的),当你点击Add时,vs会自动在Controllers下面添加相应的控制器,在views文件夹下添加Create、Edit、Delete、Details、Index五个文件。下面我们一一查看他们的内容:

#p#

控制器中,action已经自动帮你添加完毕

 
 
 
 
  1.     private BsmisEntities db = new BsmisEntities();
  2.         //
  3.         // GET: /User/
  4.         public ViewResult Index()
  5.         {
  6.             return View();
  7.         }
  8.         //
  9.         // GET: /User/Create
  10.         public ActionResult Create()
  11.         {
  12.             return View();
  13.         } 
  14.         //
  15.         // POST: /User/Create
  16.         [HttpPost]
  17.         public ActionResult Create(T_User t_user)
  18.         {
  19.             JsonResult result = new JsonResult();
  20.             result.Data = true;
  21.             try
  22.             {
  23.                 if (t_user.Enable == null)
  24.                     t_user.Enable = 0;
  25.                 db.T_User.AddObject(t_user);
  26.                 db.SaveChanges();
  27.             }
  28.             catch (Exception ee)
  29.             {
  30.                 result.Data = ee.Message;
  31.             }
  32.             return result;
  33.         }
  34.         //
  35.         // GET: /User/Edit/5
  36.         [OutputCache(Location = OutputCacheLocation.None)]
  37.         public ActionResult Edit(int id)
  38.         {
  39.             T_User t_user = db.T_User.Single(t => t.UserID == id);
  40.             ViewBag.DepartmentID = new SelectList(db.T_DepartmentInfo, "DepartmentID", "Code", t_user.DepartmentID);
  41.             return View(t_user);
  42.         }
  43.         //
  44.         // POST: /User/Edit/5
  45.         [HttpPost]
  46.         [OutputCache(Location = OutputCacheLocation.None)]
  47.         public ActionResult Edit(T_User t_user)
  48.         {
  49.             JsonResult result = new JsonResult();
  50.             result.Data = true;
  51.             try
  52.             {
  53.                 db.T_User.Attach(t_user);
  54.                 db.ObjectStateManager.ChangeObjectState(t_user, EntityState.Modified);
  55.                 db.SaveChanges();
  56.             }
  57.             catch (Exception ee)
  58.             {
  59.                 result.Data = ee.Message;
  60.             }
  61.             return result;
  62.         }
  63.         //
  64.         // POST: /User/Delete/5
  65.         [HttpPost, ActionName("Delete")]
  66.         public ActionResult DeleteConfirmed(int id)
  67.         { 
  68.        JsonResult json=new JsonResult();
  69.         json.Data=true;
  70.         try
  71.         {              T_User t_user = db.T_User.Single(t => t.UserID ==id);
  72.               db.T_User.DeleteObject(t_user);
  73.               db.SaveChanges();
  74.         }
  75.         catch(Exception ee)
  76.         {
  77.           json.Data=ee.Message;
  78.         }
  79.         return json;        }
  80.         /// 
  81.         /// 数据显示、分页信息
  82.         /// 
  83.         /// 
  84.         /// 
  85.         /// 
  86.         public JsonResult List(int page, int rows)
  87.         {
  88.             var q = from u in db.T_User
  89.                     join d in db.T_DepartmentInfo on u.DepartmentID equals d.DepartmentID
  90.                     orderby u.UserID
  91.                     select new
  92.                         {
  93.                             UserID = u.UserID,
  94.                             UserName = u.UserName,
  95.                             Address = u.Address,
  96.                             Birth = u.Birth,
  97.                             DepartmentID = u.DepartmentID,
  98.                             DepartmentName = d.Name,
  99.                             Enable = u.Enable,
  100.                             Gendar = u.Gendar,
  101.                             IDCardNumber = u.IDCardNumber,
  102.                             LastAccessIP = u.LastAccessIP,
  103.                             LastAccessTime = u.LastAccessTime,
  104.                             LogonTimes = u.LogonTimes,
  105.                             Password = u.Password,
  106.                             PostCode = u.PostCode,
  107.                             RealName = u.RealName,
  108.                             Tel = u.Tel,
  109.                             Province = u.Province,
  110.                             City = u.City,
  111.                             Area = u.Area
  112.                         };
  113.             var result = q.Skip((page - 1) * rows).Take(rows).ToList();
  114.             Dictionary json = new Dictionary();
  115.             json.Add("total", q.ToList().Count);
  116.             json.Add("rows", result);
  117.             return Json(json, JsonRequestBehavior.AllowGet);
  118.         }

这些action分别对应create、delete、edit、index视图(detail我们一般情况下不需要它,所以我的模版里没有写对应的生成代码)你可以比较一下它与原生的模版生成的代码之间的区别。后期我们还会在控制器里添加一些譬如检查名称是否重名之类的action

 
 
 
 
  1. [OutputCache(Location = OutputCacheLocation.None)]
  2.         public JsonResult CheckRealNameExist(string RealName, int UserID)
  3.         {
  4.             JsonResult result = new JsonResult();
  5.             result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
  6.             result.Data = false;
  7.             try
  8.             {
  9.                 if (UserID == 0)
  10.                 {
  11.                     if (db.T_User.Any(p => p.RealName == RealName))
  12.                     {
  13.                         return result;
  14.                     }
  15.                 }
  16.                 else
  17.                 {
  18.                     if (db.T_User.Any(p => ((p.UserID != UserID) && (p.RealName == RealName))))
  19.                     {
  20.                         return result;
  21.                     }
  22.                 }
  23.             }
  24.             catch (Exception)
  25.             {
  26.                 return result;
  27.             }
  28.             result.Data = true;
  29.             return result;
  30.         }

返回值一般都是jsonresult。这样的话,当你在浏览器中访问http://localhost:1233/User/CheckRealNameExist?RealName=张三&UserID=0时 你会获得一个true或false值。是不是跟webservice有点异曲同工?

同样,在Views文件夹中生成了Create、Edit、Details、Delete、Index五个文件,其中Details与Delete我们不需要,因为我们想使用更友好的异步删除(用户单击delete后,页面不刷新,成功后浏览器下方滑出提示,3秒后关闭,失败滑出失败信息,不自动关闭 /利用easyui中的messager组件)。以下是Index中的js:

#p#

 
 
 
 
  1. //删除
  2.         function del() {
  3.             var id = getselectedRow();
  4.             if (id != undefined) {
  5.                 $.messager.confirm('确认', '确定删除?', function (r) {
  6.                     if (r) {
  7.                         var url = 'User/Delete/' + id;
  8.                         $.post(url, function () {
  9.                         }).success(function () {
  10.                             $.messager.show({
  11.                                 title: '提示',
  12.                                 msg: '删除成功',
  13.                                 timeout: 3000,
  14.                                 showType: 'slide'
  15.                             });
  16.                             $('#dg').datagrid('reload');
  17.                         })
  18.                             .error(function () {
  19.                                 $.messager.alert('错误', '删除发生错误');
  20.                             });
  21.                     }
  22.                 });
  23.             }
  24.         }

我们把Details与Delete删除后只剩下Index、Create、Edit三个文件,这三个文件之间的关系是,Index中包含添加、编辑按钮,点击后使用js将对应的actionresult加载到div中,以实现弹窗新建,编辑的效果。

 
 
 
 
  1. //新建
  2.         function c_dlg() {
  3.             var url = 'User/Create';
  4.             $('#c_dlg').show();
  5.             $('#c_dlg').load(url, function () {
  6.                 $(this).dialog({
  7.                     title: '添加',
  8.                     buttons: [{
  9.                         text: '提交',
  10.                         iconCls: 'icon-ok',
  11.                         handler: function () {
  12.                             $('#c_form').submit();
  13.                         }
  14.                     }, {
  15.                         text: '取消',
  16.                         handler: function () {
  17.                             $('#c_dlg').dialog('close');
  18.                         }
  19.                     }]
  20.                 });
  21.             });
  22.         }
  23.         //编辑框
  24.         function e_dlg() {
  25.             var id = getselectedRow();
  26.             if (id != undefined) {
  27.                 var url = 'User/Edit/' + id;
  28.                 $('#e_dlg').show();
  29.                 $('#e_dlg').load(url, function () {
  30.                     $(this).dialog({
  31.                         title: '编辑',
  32.                         buttons: [{
  33.                             text: '提交',
  34.                             iconCls: 'icon-ok',
  35.                             handler: function () {
  36.                                 $('#e_form').submit();
  37.                             }
  38.                         }, {
  39.                             text: '取消',
  40.                             handler: function () {
  41.                                 $('#e_dlg').dialog('close');
  42.                             }
  43.                         }]
  44.                     });
  45.                 });
  46.             }
  47.         }

这里面的c_dlg与e_dlg是index页面的两个Div节点:

 
 
 
 
  • 以上的代码完成将控制器中的action返回的页面内容动态加载到div中,并以弹窗的特效显示在当前(Index)页面中。效果如图:

    我们来看看Create\Edit视图的内容,首先是js

    #p#

     
     
     
     
    1.     $(function () {
    2.         $('#c_Department').combotree({
    3.             url: '@Url.Action("GetComboTreeJson","Department")'
    4.         });
    5.         $('#c_City').combobox();
    6.         $('#c_Area').combobox();
    7.         
    8.         $('#c_Province').combobox({ url:'CityDic/List/ID/0',
    9.             onSelect: function (record) {
    10.                 $('#c_City').combobox('reload', 'CityDic/List/ID/' + record.ID).combobox('clear');
    11.                 $('#c_Area').combobox('clear');
    12.             }
    13.         });
    14.         $('#c_City').combobox({
    15.             onSelect: function (record) {
    16.                 $('#c_Area').combobox('reload', 'CityDic/List/ID/' + record.ID).combobox('clear');
    17.             }
    18.         });
    19.         
    20.         $('#c_Birth').datebox().datebox('setValue', '@now');
    21.         
    22.         $("#c_form").validate({
    23.             rules: {
    24.                 UserName: {
    25.                     required: true,
    26.                     remote:
    27.                         {
    28.                             url: 'User/CheckNameExist',
    29.                             type: "get",
    30.                             dataType: "json",
    31.                             data: {
    32.                                 Name: function () { return $('#c_UserName').val(); },
    33.                                 UserID: function () { return 0; }
    34.                             }
    35.                         }
    36.                 },
    37.                 RealName: {
    38.                     required:true,
    39.                     remote: {
    40.                         url: 'User/CheckRealNameExist',
    41.                         type: "get",
    42.                         dataType: "json",
    43.                         data: {
    44.                             RealName: function () { return $('#c_RealName').val(); },
    45.                             UserID: function () { return 0; }
    46.                         }
    47.                     }
    48.                 }
    49.             },
    50.             messages: {
    51.                 UserName: {
    52.                     remote: '名称重复'
    53.                 }, 
    54.                 RealName: { remote: '名称重复' }
    55.             },
    56.             submitHandler: function (form) {
    57.                 ajaxAdd();
    58.             }
    59.         });
    60.     });

    这部分js将本页面的控件初始化为对应的下拉框或日期选取框等等,Html为

     
     
     
     
    1. @using (Html.BeginForm("Create", "User", FormMethod.Post, new { id = "c_form" }))
    2. {
    3.  
    4.         
    5.             
    6.                 
    7.                     @Html.LabelFor(model => model.UserName, "用户名:")
    8.                 
    9.                 
    10.                     
    11.                    
    12.                         *
    13.                 
    14.             
    15.             
    16.                 
    17.                     @Html.LabelFor(model => model.DepartmentID, "组织机构:")
    18.                 
    19.                 
    20.                     
    21.                         *
    22.                 
    23.             
    24.             
    25.                 
    26.                     @Html.LabelFor(model => model.Password, "密码:")
    27.                 
    28.                 
    29.                     @Html.PasswordFor(model => model.Password, new { @class = "{required:true,minlength:5}" })
    30.                         *
    31.                 
    32.             
    33.             
    34.                 
    35.                      当前名称:MVC3快速搭建Web应用(二)
      链接地址:http://www.csdahua.cn/qtweb/news1/361651.html

      网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

      广告

      声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网

    成都快上网为您推荐相关内容

    做网站知识

    同城分类信息