ASP.NET MVC

绝大多数的公司已经用上了ASP.NET MVC,博主手里也做了不少个MVC的项目,在这里分享一下我在项目中是如何使用MVC的

打造通用的异常处理

项目上线运行,并不是所有的时候都正常运行的,偶尔也会崩溃报错。发生各种各样的例外,这并不是可怕因为这是每一个项目都无法去避免的。而我们能做的就是针对异常进行收集处理分析,以便在第一时间发现问题去修改bug。

如果每一个action都用try{}…catch{}..包围的话,那自然并不是什么优秀的处理。MVC给我们提供了好用的filter,我们可以自定义一个处理异常的filter。

这时需要思考,filter应该放在哪里?是在web项目中吗?显然公司并不只有一个项目,就算是后台也会是一个单独的项目。难道做新项目的时候都要把filter拷贝过去?这显然是不合理的。我的做法是放在基础设施里。

上图中MvcExceptionFilterAttribute就是异常处理过滤器了,而FilterConfig则是把过滤器添加到filter集合中,这样带来的效果就是,如果有项目需要进行异常处理,只需要引用这个项目并且在global里使用filterconfig的RegisterGlobalFilters方法来注册过滤器就可以了

/// <summary>
    /// Mvc异常过滤器
    /// </summary>
    public class MvcExceptionFilterAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            try
            {
                filterContext.Exception.ToExceptionless().Submit();
            }
            finally
            {
                //设置为true阻止golbal里面的错误执行
                filterContext.ExceptionHandled = true;
              filterContext.Result = new JsonResult() { Data = ResponseManager.GetOutputResponse(OutputStatus.Error), JsonRequestBehavior = JsonRequestBehavior.AllowGet };
            }

        }
    }
public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //全局异常过滤
            filters.Add(new MvcExceptionFilterAttribute());

            filters.Add(new MvcActionProcessFilterAttribue());

        }
    }
//初始化filter
  FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

打造通用的模型验证

mvc为我们提供了模型验证,我们只需要使用ModelState.IsValid就可以进行参数合法性验证,当然这需要我们使用Data Annotations或Fluent API。这使得在我们不需要在每个用到这个实体的方法里做一大堆的参数验证,但是仍然要在Action中判断ModelState.IsValid。我需要的是只要进入了这个action,那么参数都是合法的。这是AOP的思想,使开发者更专注业务,而不是一堆繁琐的验证。

打造一个通用的模型验证显的很必要,首先创建一个ModelValidAttribute类继承ActionFilterAttribute。重写OnActionExecuting方法,在方法里进行参数验证。在需要进行验证的action贴上ModelValid注解即可

/// <summary>
    /// Model参数验证拦截器
    /// </summary>
    public class ModelValidAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var con = filterContext.Controller as Controller;
            if (!con.ModelState.IsValid)
            {
                string errorMessage = "服务器繁忙,请稍后再试";
                foreach (var value in con.ModelState.Values)
                {
                    if (!value.Errors.AsEnumerable().Any()) continue;
                    foreach (var error in value.Errors)
                    {
                        errorMessage = error.ErrorMessage;
                        break;
                    }
                    break;
                }

                filterContext.Result = new JsonResult() { Data = ResponseManager.GetOutputResponse(OutputStatus.NoParameter, errorMessage), JsonRequestBehavior = JsonRequestBehavior.AllowGet };
            }

        }
    }
        [ModelValid]
        public async Task<ContentResult> Login(Login input)
        {
            return JsonData(await LoginService.Login(input));

        }

MVC项目经验杂谈的更多相关文章

  1. 基于MVC4+EasyUI的Web开发框架经验总结(15)--在MVC项目中使用RDLC报表

    RDLC是一个不错的报表,有着比较不错的设计模式和展现效果,在我的Winform开发里面,使用RDLC也是一个比较方便操作,如可以参考文章<DevExpress的XtraReport和微软RDL ...

  2. Java项目经验——程序员成长的关键(转载)

    Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的分析与设计技巧3.掌握用例驱动.以 ...

  3. Java项目经验

    Java项目经验 转自CSDN. Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的 ...

  4. 一年开发ASP.NET MVC4项目经验总结

    一年开发ASP.NET MVC4项目所用所学技术经验总结 阅读目录 文章背景 前端所用技术摘要 后端所用技术摘要 1. 文章背景 本人2014年从Java转行到C#从事BS项目的开发,刚开始接触的是A ...

  5. 最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备

    在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面 ...

  6. java程序员面试交流项目经验

    粘贴自:https://blog.csdn.net/wangyuxuan_java/article/details/8778211 1:请你介绍一下你自己 这是面试官常问的问题.一般人回答这个问题过于 ...

  7. 项目经验分享[转自min.jiang]

        最近三个月,我非常荣幸的做为TeamLeader带领几个小组成员做了一个国外项目,这里想为大家分享一些小经验,尽管我佣有六年多的项目经验,但我一直的方向是架构师.大家知道架构师一般情况是偏向技 ...

  8. java面试项目经验:框架及应用

    Java项目经验 Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的分析与设计技巧3 ...

  9. 转:java项目经验面试总结

    转载: 在前期已经讲过怎样分析自己,对自己进行一个准确的定位,选择一个合适的求职方向!并结合自己的实际个人情况来写一份针对性很强的个人简历!个人简历就是个人的广告!好的简历可以更受到用人需求单位青睐! ...

随机推荐

  1. 牛X的CSS3

    See the Pen Dot Wave by Rich Howell (@roborich) on CodePen

  2. 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  3. mvc5 Html.EditorFor html属性有了新变化,和以前的不同了

    @Html.EditorFor(model => model.MaxNumber, new { htmlAttributes = new { @min = "1" } })

  4. c++ 指针(一)

    指针:是说指针名表示的是地址.是一个变量,存储的是值的地址,而不是值本身 *运算符被称为间接值或解除引用运算符也可以叫做取地址符 声明一个指针 int * p_data; * p_data的类型为in ...

  5. lambda函数、lambda表达式

    C++11 新特性:Lambda 表达式 豆子 2012年5月15日 C++ 10条评论 参考文章:https://blogs.oracle.com/pcarlini/entry/c_1x_tidbi ...

  6. Hotspot内存溢出测试

    一.堆溢出 在执行代码时通过设置堆的最小值-Mms以及堆的最大值-Mmx来控制堆的大小,-XX参数dump出堆内存快照以便对内存溢出进行分析.通过创建大量对象来使堆溢出,当堆内存溢出时会提示OutOf ...

  7. CSS3——让最后一行显示省略号

    代码如下: <!DOCTYPE html> <html> <head> <title></title> <meta charset=& ...

  8. hwclock 显示或设置CMOS时间

    显示或设置CMOS时间 hwclock [options] 选项 -r               默认选项,读取并打印CMOS时间 -s               将CMOS时间设置为系统时间 - ...

  9. Android 轻量级输入校验库:Fire Eye

    Fire Eye是一款轻量级简单易用的Android校验库. FireEye 2.0 在 1.0 的基础上,全部重写了代码,并优化了架构,性能上和逻辑上都大大提升.只需要几行代码,即可验证用户输入,并 ...

  10. RabbitMQ 路由选择 (Routing)

    让日志接收者能够订阅部分消息.例如,我们可以仅仅将致命的错误写入日志文件,然而仍然在控制面板上打印出所有的其他类型的日志消息. 1.绑定(Bindings) 在前面中我们已经使用过绑定.类似下面的代码 ...