自打上篇《依据MVC4+EasyUI的Web开发框架形成之旅–总体介绍》总体性的不外乎,拿到许多同行的关切和支撑,不过上一篇重假设介绍贰个完完全全的界面效果和笔触,本体系的篇章将逐级介绍其中的细节,本文主要介绍任何Web开发框架中的MVC控制器的宏图。在规划之初,小编就可望尽量的回落代码,进步编程模型的统一性。因而希望可以以基类继承的方法,和本身Winform开发框架一样,尽只怕通过基类,而不是子类的再一次代码来贯彻各个通用的操作。

一,登录控制的控制器基类设计

作者们精晓,一般大家成立二个MVC的控制器,都以基于Controller那样的基类来兑现。如下代码所示。

图片 1

    public class TestController : Controller
    {
        //
        // GET: /Test/

        public ActionResult Index()
        {
            return View();
        }

    }

在本身的Winform开发框架之中,用到了泛型的档次,格外便宜达成工作逻辑和数码访问基类的宏图,控制器是或不是也得以这么做的啊?

我们清楚,一般的MVC控制器需求证实用户是还是不是曾经登陆了,那也是无数常见Web操作前的验证,还有对这个的处理,在MVC的基类,可以一并举办记录(那一个丰裕科学),于是大家先来规划2个表明用户地点是还是不是登陆的基类BaseController

    /// <summary>
    /// 所有需要进行登录控制的控制器基类
    /// </summary>
    public class BaseController : Controller 
    {
        /// <summary>
        /// 当前登录的用户属性
        /// </summary>
        public UserInfo CurrentUserInfo { get; set; }

        /// <summary>
        /// 重新基类在Action执行之前的事情
        /// </summary>
        /// <param name="filterContext">重写方法的参数</param>
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            //得到用户登录的信息
            CurrentUserInfo = Session["UserInfo"] as UserInfo;

            //判断用户是否为空
            if (CurrentUserInfo == null)
            {
                Response.Redirect("/Login/Index");
            }
        }

        protected override void OnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);

            //错误记录
            WHC.Framework.Commons.LogTextHelper.Error(filterContext.Exception);

            // 当自定义显示错误 mode = On,显示友好错误页面
            if (filterContext.HttpContext.IsCustomErrorEnabled)
            {
                filterContext.ExceptionHandled = true;
                this.View("Error").ExecuteResult(this.ControllerContext);
            }
        }
........................
    }

有了这些基类,我们在主页的Home控制类,就足以接纳用户消息目的了举办操作了,而且必需须要客户登陆了。

    public class HomeController : BaseController
    {
        public ActionResult Index()
        {
            if (CurrentUserInfo != null)
            {
                ViewBag.FullName = CurrentUserInfo.FullName;
                ViewBag.Name = CurrentUserInfo.Name;
            }
            return View();
        }
................
    }

 

2、数据访问工作基类控制器的布置

本人在自己的Winform开发框架之中,对很多基类都采用泛型举办统筹,那样可以传递相应的数据类型到基类里面进行处理,如下边的BLL层的工作对象定义代码如下所示。

namespace WHC.Security.BLL
{
    /// <summary>
    /// 角色信息业务管理类
    /// </summary>
    public class Role : BaseBLL<RoleInfo>
    {

....................

    /// <summary>
    /// 业务基类对象
    /// </summary>
    /// <typeparam name="T">业务对象类型</typeparam>
    public class BaseBLL<T> where T : BaseEntity, new()
    {

        /// <summary>
        /// 插入指定对象到数据库中
        /// </summary>
        /// <param name="obj">指定的对象</param>
        /// <returns>执行操作是否成功。</returns>
        public virtual bool Insert(T obj)
        {
            return baseDal.Insert(obj);
        }

............

政工对象Role,须求传入RoleInfo给基类处理,那样基类就能定义到都对应的T为具体的RoleInfo类型了。在MVC的控制器是或不是也足以如此做吗?当然可以,上边是自家定义的多少个控制器继承关系图。

图片 2

上边的介绍也曾经比较明白了,其实就是在BusinessController<B,
T>里面传出了七个参数,定义代码如下所示。

    /// <summary>
    /// 本控制器基类专门为访问数据业务对象而设的基类
    /// </summary>
    /// <typeparam name="B">业务对象类型</typeparam>
    /// <typeparam name="T">实体类类型</typeparam>
    public class BusinessController<B, T> : BaseController
        where B : class
        where T : WHC.Framework.ControlUtil.BaseEntity, new()
    {

        /// <summary>
        /// 插入指定对象到数据库中
        /// </summary>
        /// <param name="info">指定的对象</param>
        /// <returns>执行操作是否成功。</returns>
        public virtual ActionResult Insert(T info)
        {
            bool result = false;
            if (info != null)
            {
                result = baseBLL.Insert(info);
            }
            return Content(result);
        }

................

自家根据传入的BLL业务对象类型B,对象实体类类型T,那么大家就足以社团对应的baseBLL对象,然后调用其基类接口完结主题的操作,如插入,删除,更新,查找等等,那样的模式就和小编的Winform开发框架的看法特别符合了。

大家以角色控制器来证实,它的定义如下所示,假使不须要贯彻额外的接口(除了常见的操作),基本上不需求写任何代码了,因为所有很多大面积的操作,都早已封装在了基类控制器BusinessController<B,
T>里面了。

    /// <summary>
    /// 角色业务操作控制器
    /// </summary>
    public class RoleController : BusinessController<Role, RoleInfo>
    {
        public RoleController() : base()
        {
        }

...............

对此部分急需特殊数据处理的操作,可以扩展一些自定义的接口函数,也足以重写基类的部分接口,完毕数量的呼应处理。如作者的菜单界面突显中,须求基于缩进的层级对菜单名称进行缩进,以便更好的浮现它们的层级结构,那么自个儿就须求对分页函数进行重写了,如下代码所示是任何菜单Menu类的决定器类代码。

    public class MenuController : BusinessController<Menu, MenuInfo>
    {
        public override ActionResult FindWithPager()
        {
            string where = GetPagerCondition(); //基类实现
            PagerInfo pagerInfo = GetPagerInfo(); //基类实现            
            List<MenuInfo> list = baseBLL.FindWithPager(where, pagerInfo);
            list = CollectionHelper<MenuInfo>.Fill("-1", 0, list, "PID", "ID", "Name");

            //Json格式的要求{total:22,rows:{}}
            //构造成Json的格式传递
            var result = new { total = pagerInfo.RecordCount, rows = list };
            return JsonDate(result);
        }

        /// <summary>
        /// 用作下拉列表的菜单Json数据
        /// </summary>
        /// <returns></returns>
        public ActionResult GetDictJson()
        {
            List<MenuInfo> list = baseBLL.GetAll();
            list = CollectionHelper<MenuInfo>.Fill("-1", 0, list, "PID", "ID", "Name");

            List<CListItem> itemList = new List<CListItem>();
            foreach (MenuInfo info in list)
            {
                itemList.Add(new CListItem(info.Name, info.ID));
            }
            return Json(itemList, JsonRequestBehavior.AllowGet);
        }
    }

 

咱俩来看看一段HTML页面里面,使用javascript脚本调用控制器API来贯彻数量的绑定的操作,相当于行使示例。

            $.getJSON("/Role/FindById?r=" + Math.random() + "&id=" + id, function (json) {
                $("#txtID").val(json.ID);
                $("#txtName").val(json.Name);
                $("#txtNote").val(json.Note);
            });

上边那个很专业的接口FindById是事情基类控制器BusinessController<B,
T>里提供的。

本来,BusinessController里面可以接近作者Winform开发框架之中基类一样,提供很充分的操作接口,如再次来到列表Json集合,增删改查的操作及重回,分页数据的回到,以及部分格外的操作都可以兑现。而那么些都不要求子类举办其余完结。

如上边实际案例的用户登陆日志,里面的界面效能仍然很丰硕的,当他的控制器业务类不需要任何完成,只需要继续基类即可。

图片 3

    public class LoginLogController : BusinessController<LoginLog, LoginLogInfo>
    {
        public LoginLogController() : base()
        {
        }

    }

界面部分代码如下所示。

        //实现对DataGird控件的绑定操作
        function InitGrid(queryData) {
            $('#grid').datagrid({   //定位到Table标签,Table标签的ID是grid
                url: '/LoginLog/FindWithPager',   //指向后台的Action来获取当前用户的信息的Json格式的数据
                title: '用户登陆日志', 
                //下面的这些属性如果谁不太清楚的话我建议去官方网站去学习
                iconCls: 'icon-view',
                height: 450,
                nowrap: true,
                autoRowHeight: false,
                striped: true,
                collapsible: true,
                pagination: true,
                rownumbers: true,
                //sortName: 'ID',    //根据某个字段给easyUI排序
                sortOrder: 'asc',
                remoteSort: false,
                idField: 'ID',
                queryParams: queryData,  //异步查询的参数
                columns: [[
                    { field: 'ck', checkbox: true },   //选择
                    { title: 'ID', field: 'ID', width: 40, sortable: true },  //主键
                     { title: '登录用户ID', field: 'User_ID', width: 80, sortable: true },
                     { title: '登录名称', field: 'LoginName', width: 80, sortable: true },
                     { title: '真实名称', field: 'FullName', width: 80, sortable: true },
                     { title: '日志描述', field: 'Note', width: 100, sortable: true },
                     { title: 'IP地址', field: 'IPAddress', width: 100, sortable: true },
                     { title: 'Mac地址', field: 'MacAddress', width: 120, sortable: true },
                     { title: '系统编号', field: 'SystemType_ID', width: 120, sortable: true },
                     { title: '记录日期', field: 'LastUpdated', width: 120, sortable: true },
                ]],
                toolbar: [{
                    id: 'btnAdd',
                    text: '添加',
                    iconCls: 'icon-add',
                    handler: function () {                        
                        ShowAddDialog();//实现添加记录的页面
                    }
                }, '-', {
                    id: 'btnEdit',
                    text: '修改',
                    iconCls: 'icon-edit',
                    handler: function () {                        
                        ShowEditOrViewDialog();//实现修改记录的方法
                    }
                }, '-', {
                    id: 'btnDelete',
                    text: '删除',
                    iconCls: 'icon-remove',
                    handler: function () {                        
                        Delete();//实现直接删除数据的方法
                    }
                }, '-', {
                    id: 'btnView',
                    text: '查看',
                    iconCls: 'icon-table',
                    handler: function () {                        
                        ShowEditOrViewDialog("view");//实现查看记录详细信息的方法
                    }
                }, '-', {
                    id: 'btnReload',
                    text: '刷新',
                    iconCls: 'icon-reload',
                    handler: function () {
                        //实现刷新栏目中的数据
                        $("#grid").datagrid("reload");
                    }
                }]
            });

            $('#grid').datagrid({
                onDblClickRow: function (rowIndex, rowData) {
                    $('#grid').datagrid('uncheckAll');
                    $('#grid').datagrid('checkRow', rowIndex);
                    ShowEditOrViewDialog();
                }
            });
        }

以此就是自个儿的控制器设计的中坚思想了,下一篇一而再介绍全部的MVC体系的Web开发框架,介绍其中Web界面部分的拍卖和血脉相通经验,希望我们多多提议宝贵的见解。

 

依照MVC4+EasyUI的Web开发框架的千家万户文章:

据悉MVC4+EasyUI的Web开发框架形成之旅–总体介绍

基于MVC4+EasyUI的Web开发框架形成之旅–MVC控制器的规划

依据MVC4+EasyUI的Web开发框架形成之旅–界面控件的行使

依照MVC4+EasyUI的Web开发框架形成之旅–附件上传组件uploadify的利用

依照MVC4+EasyUI的Web开发框架形成之旅–框架总体界面介绍

据悉MVC4+EasyUI的Web开发框架形成之旅–基类控制器CRUD的操作

据悉MVC4+EasyUI的Web开发框架形成之旅–权限决定

基于MVC4+EasyUI的Web开发框架经验总括(1)-利用jQuery Tags Input
插件突显接纳记录

基于MVC4+EasyUI的Web开发框架经验总计(2)-
使用EasyUI的树控件创设Web界面

依照MVC4+EasyUI的Web开发框架经验统计(3)-
使用Json实体类创设菜单数据

依照MVC4+EasyUI的Web开发框架经验总括(4)–使用图表控件Highcharts

依照MVC4+EasyUI的Web开发框架经验总计(5)–使用HTML编辑控件CKEditor和CKFinder

依据MVC4+EasyUI的Web开发框架经验计算(6)–在页面中应用下拉列表的处理

根据MVC4+EasyUI的Web开发框架经验统计(7)–完成省份、城市、行政区三者联动

据悉MVC4+EasyUI的Web开发框架经验计算(8)–已毕Office文档的预览

据悉MVC4+EasyUI的Web开发框架经验总括(9)–在Datagrid里面已毕外键字段的转义操作

据悉MVC4+EasyUI的Web开发框架经验统计(10)–在Web界面上贯彻多少的导入和导出

据悉MVC4+EasyUI的Web开发框架经验统计(11)–使用Bundles处理简化页面代码

基于MVC4+EasyUI的Web开发框架经验总计(12)–利用Jquery处理数量交互的三种方法

基于MVC4+EasyUI的Web开发框架经验统计(13)–DataGrid控件完毕自动适应宽带中度

基于MVC4+EasyUI的Web开发框架经验统计(14)–自动生成图标样式文件和图标的选料操作

相关文章

网站地图xml地图