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项目经验面试总结
转载: 在前期已经讲过怎样分析自己,对自己进行一个准确的定位,选择一个合适的求职方向!并结合自己的实际个人情况来写一份针对性很强的个人简历!个人简历就是个人的广告!好的简历可以更受到用人需求单位青睐! ...
随机推荐
- Spring 4.0.2 学习笔记(2) - 自动注入及properties文件的使用
接上一篇继续, 学习了基本的注入使用后,可能有人会跟我一样觉得有点不爽,Programmer的每个Field,至少要有一个setter,这样spring配置文件中才能用<property> ...
- ios蓝牙开发(四)app作为外设被连接的实现-转发
代码下载: 原博客中大部分示例代码都上传到了github,地址是:https://github.com/coolnameismy/demo. 再上一节说了app作为central连接periphera ...
- QTableView 添加进度条
记录一下QTableView添加进度条 例子很小,仅供学习 使用QItemDelegate做的实现 有自动更新进度 要在.pro文件里添加 CONFIG += c++ ProgressBarDeleg ...
- DOM 元素节点几何量与滚动几何量
当在 Web 浏览器中查看 HTML 文档时,DOM 节点被解析,并被渲染成盒模型(如下图),有时我们需要知道一些信息,比如盒模型的大小,盒模型在浏览器中的位置等等,本文我们就来详细了解下元素节点的几 ...
- 微信公众平台开发(71)OAuth2.0网页授权
微信公众平台开发 OAuth2.0网页授权认证 网页授权获取用户基本信息 作者:方倍工作室 微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在使 ...
- SQL基础之GROUPING
1.grouping sets 记得前几天第一次接触grouping sets时,笔者的感觉是一脸懵逼. 后来一不小心看到msdn上对grouping sets的说明,顿时豁然开朗,其实groupin ...
- html文本标准模式,首行空两格,两端对齐,行高
font-size: 13px; line-height: 1.6; text-align: justify; text-indent: 2em;
- 让计算机崩溃的python代码,求共同分析
在现在的异常机制处理的比较完善的编码系统里面,让计算机完全崩溃无法操作的代码还是不多的.今天就无意运行到这段python代码,运行完,计算机直接崩溃,任务管理器都无法调用,任何键都用不了,只能强行电源 ...
- ContentProvider备份短信,以xml文件存储
因为短信的内容已经通过ContentProvider暴露出来,所以我们可以直接用内容解析者获取短信内容. 想要获取短信内容,你需要知道的一些东西: 1.Uri uri = Uri.parse(&quo ...
- android开发------编写用户界面之线性布局
一个好的应用程序离不开人性化的用户界面.在学习其他东西之前.理应先学习编写程序的布局(外观) 今天,我们就来学习android的UI布局----LinearLayout. LinearLayout,即 ...