MVC项目经验杂谈
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项目经验杂谈的更多相关文章
- 基于MVC4+EasyUI的Web开发框架经验总结(15)--在MVC项目中使用RDLC报表
RDLC是一个不错的报表,有着比较不错的设计模式和展现效果,在我的Winform开发里面,使用RDLC也是一个比较方便操作,如可以参考文章<DevExpress的XtraReport和微软RDL ...
- Java项目经验——程序员成长的关键(转载)
Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的分析与设计技巧3.掌握用例驱动.以 ...
- Java项目经验
Java项目经验 转自CSDN. Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的 ...
- 一年开发ASP.NET MVC4项目经验总结
一年开发ASP.NET MVC4项目所用所学技术经验总结 阅读目录 文章背景 前端所用技术摘要 后端所用技术摘要 1. 文章背景 本人2014年从Java转行到C#从事BS项目的开发,刚开始接触的是A ...
- 最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备
在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面 ...
- java程序员面试交流项目经验
粘贴自:https://blog.csdn.net/wangyuxuan_java/article/details/8778211 1:请你介绍一下你自己 这是面试官常问的问题.一般人回答这个问题过于 ...
- 项目经验分享[转自min.jiang]
最近三个月,我非常荣幸的做为TeamLeader带领几个小组成员做了一个国外项目,这里想为大家分享一些小经验,尽管我佣有六年多的项目经验,但我一直的方向是架构师.大家知道架构师一般情况是偏向技 ...
- java面试项目经验:框架及应用
Java项目经验 Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的分析与设计技巧3 ...
- 转:java项目经验面试总结
转载: 在前期已经讲过怎样分析自己,对自己进行一个准确的定位,选择一个合适的求职方向!并结合自己的实际个人情况来写一份针对性很强的个人简历!个人简历就是个人的广告!好的简历可以更受到用人需求单位青睐! ...
随机推荐
- druid 数据源 使用属性文件的一个坑
直接上代码: <bean id="propertiesFactoryBean" class="org.springframework.beans.factory.c ...
- 纯手工搭建JSF开发环境(JSF2.2+maven+weblogic 12c/jboss EAP 6.1+)
前言: JSF 2.X因为种种原因(我个人觉得主要是因为推出太晚),再加上EJB2之前的设计过于复杂,引起很多开发人员对官方解决方案的反感,即使EJB3后来做了大量改进,国内也很少有人对EJB3感兴趣 ...
- 去除项目中的SVN标记
第一步:建立一个名字叫做remove-svn-folders.reg的文本(先建立txt文件,然后粘贴内容后再修改文件名字),记得后缀要叫.reg.文本的内容为: Windows Registry E ...
- Windows系统防火墙用法
1.按下“Win+X”组合键呼出系统快捷菜单,点击打开“控制面板”: 2.将“查看方式”修改为[大图标],然后点击“Windows 防火墙”: 3.在防火墙窗口左侧点击“高级设置”:(若防火墙未开启, ...
- matlab中的xcorr 自相关函数
转载自 http://blog.163.com/to_be_myself/blog/static/176060227201101762159227/ Matlab中用于计算自相关函数的指令是xcorr ...
- android中的屏幕单位介绍
1.px (pixels)(像素):是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px 会比较多.通常不推荐使用这个. 2.dip 或dp(与密度无关的像素):一个基于density(密度)的 ...
- git 保存用户名和密码
打开TortoiseGit控制面板 点击 Edit global .gitconfig文件 添加 [credential] helper = store OK了 你再登录一次之后密码就被记住了
- 【POJ 3243】Clever Y 拓展BSGS
调了一周,我真制杖,,, 各种初始化没有设为1,,,我当时到底在想什么??? 拓展BSGS,这是zky学长讲课的课件截屏: 是不是简单易懂.PS:聪哥说“拓展BSGS是偏题,省选不会考,信我没错”,那 ...
- 【转】c# 调用windows API(user32.dll)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- poj2553 强连通缩点
The Bottom of a Graph Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 10114 Accepted: ...