在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
原创文章转载请注明出处:@协思, 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)); |
请发表评论