ASP.NET MVC项目实践技巧
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com
在.NET开发初期,微软提供的WEB开发模型是WebForm,试图消除Web和桌面的隔阂,建立一致的开发体验。但是,理想很丰满,现实很骨感,Web的开发方式和桌面软件是完全不一样的。相比WebForm,后出道的MVC显然切合了Web开发者的需求,代码质量明显提升,性能也优化了不少。
在做MVC项目时,我个人有一些习惯:
1. 将Request和Response中经常使用的方法封装为扩展方法,比如获取登录UserId的方法:
public static AuthMemberInfo GetMember(this HttpRequestBase request)
{
if (request.IsAuthenticated)
{
HttpCookie authCookie = request.Cookies[FormsAuthentication.FormsCookieName];
FormsAuthenticationTicket Ticket = FormsAuthentication.Decrypt(authCookie.Value);
return JsonConvert.DeserializeObject<AuthMemberInfo>(Ticket.UserData);
}
return null;
}
2. 权限验证继承AuthorizeAttribute类,实现自己的验证逻辑:
public override void OnAuthorization(AuthorizationContext filterContext)
{
var user = filterContext.HttpContext.Request.GetMember(); if (user == null)
{
filterContext.Result = new RedirectResult(FormsAuthentication.LoginUrl
+ "?returnUrl=" + filterContext.HttpContext.Server.UrlEncode
(filterContext.HttpContext.Request.RawUrl));
return;
}
}
如此一来,在任何需要做权限验证的Controller或者方法上加上这个Attribute即可。
3. 所有的Controller都继承自定义的BaseController,目的是可以在必要时作统一行为,比如在OnException中记录日志。
4. MVC使用框架的JSON序列化器比较坑爹,特别是日期的处理不是ISO格式,给前端JS带来麻烦。 我们可以在BaseController中Override Json方法处理:
protected override JsonResult Json(object data, string contentType,
Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonNetResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}
JsonNetResult使用了Json.net作序列化器,灵活了不少:
public class JsonNetResult : JsonResult
{
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context"); var response = context.HttpContext.Response; response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; if (ContentEncoding != null)
response.ContentEncoding = ContentEncoding; if (Data == null)
return; var serializedObject = JsonConvert.SerializeObject(Data, Formatting.Indented,
new StringEnumConverter { CamelCaseText = false });
response.Write(serializedObject);
}
}
5. Global.asax捕获到全局异常后,统一交给ErrorController处理:
var routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("action", "ThrowError");
routeData.Values.Add("message", "很抱歉,服务器发生内部错误。");
Server.ClearError(); //输出业务异常信息
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(this.Context), routeData));
ASP.NET MVC项目实践技巧的更多相关文章
- MVC项目实践,在三层架构下实现SportsStore-09,ASP.NET MVC调用ASP.NET Web API的查询服务
ASP.NET Web API和WCF都体现了REST软件架构风格.在REST中,把一切数据视为资源,所以也是一种面向资源的架构风格.所有的资源都可以通过URI来唯一标识,通过对资源的HTTP操作(G ...
- [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)
本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...
- MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构
在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...
- MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-04,实现分页
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-05,实现导航
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-06,实现购物车
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
随机推荐
- ASP.NET Boilerplate终于发布v1.0了
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:ABP经过2年多的开发,终于发布第一个主要版本了,谨此提醒ABP的使用者. ASP.N ...
- UWP学习记录2-设计和UI之布局
UWP学习记录2-设计和UI之布局 1.导航基础知识 应用里,多个页面会有层次关系或者对等关系.这两种关系,通常在一个复杂应用里都会存在,而关系的选定依据: 对于对等导航,一般用选项卡(tabs)或者 ...
- resin实现域名访问
1.修改resin.properties 2.修改hosts文件 3.添加一行记录 配置完后就可以通过test.com访问项目了.
- Spring MVC类型转换
类型转换器引入 为什么页面上输入"12",可以赋值给Handler方法对应的参数?这是因为框架内部帮我们做了类型转换的工作.将String转换成int 但默认类型转换器并不是可以将 ...
- MIT 6.828 JOS学习笔记13 Exercise 1.10
Lab 1 Exercise 10 为了能够更好的了解在x86上的C程序调用过程的细节,我们首先找到在obj/kern/kern.asm中test_backtrace子程序的地址, 设置断点,并且探讨 ...
- SPOJ - PLSQUARE Palin Squar(hash+回文串)
题意:给你一个n*n (n<=200)的字符串矩阵,问你每行每列都是回文串的最大的m*m的矩阵是多少 题解:首先答案不满足单调性,即m成立而m-1与m+1都却不一定成立,所以必须枚举答案确定现在 ...
- poj分类 很好很有层次感。
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
- Vue - 事件绑定
1.内联方式: A:将事件处理器绑定到一个方法中,以下所有事件都以click事件作为案例 注意:内联方式下事件处理器只能绑定一个方法,要是想要绑定多个方法,依旧还是使用js中的addEventList ...
- python RecursionError: maximum recursion depth exceeded in comparison错误
处理快速排序,递归深度可能非常大,而系统默认的深度可能没有这么大 需要设置最大递归深度 import sys sys.setrecursionlimit(100000) # 这个值的大小取决你自己,最 ...
- JavaMail和James的秘密花园
JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.我们可以基于JavaMail开发出类似于Micros ...