zoukankan      html  css  js  c++  java
  • 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));
  • 相关阅读:
    值初始化-new
    CLI-error
    批量处理
    makefile --文件文档经链接使用
    数据库查询优化
    动态加载数据抓取-Ajax
    requests.post()
    requests.get()参数
    xpath练习(链家二手房案例,百度贴吧图片抓取案例)
    xpath解析.lxml解析库
  • 原文地址:https://www.cnblogs.com/zeeman/p/3976059.html
Copyright © 2011-2022 走看看