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));
时间: 2024-10-13 01:09:10

ASP.NET MVC项目实践技巧的相关文章

MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层

SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管理.图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离.本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能. 本篇为系列第二篇,包括: ■ 4.三层架构设计    □ 4.2 创建DbSession层 数据访问层的统一入口   

MVC项目实践,在三层架构下实现SportsStore-01

SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管理.图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离.本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能. 本篇为系列第一篇,包括: ■ 1.搭建项目■ 2.卸载Entity Framework组件,并安装最新版本■ 3.使用

MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

http://www.cnblogs.com/darrenji/p/3809219.html 本篇为系列第一篇,包括: ■ 1.搭建项目■ 2.卸载Entity Framework组件,并安装最新版本■ 3.使用EF Code First创建领域模型和EF上下文■ 4.三层架构设计    □ 4.1 创建DAL层        ※ 4.1.1 MySportsStore.IDAL详解        ※ 4.1.2 MySportsStore.DAL详解 1.搭建项目 MySportsStore.

MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等

SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管理.图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离.本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能. 本篇为系列第三篇,包括: ■ 5.自定义Ninject控制器工厂■ 6.项目的第一次运行 5.自定义Ninject控制

MVC项目实践,在三层架构下实现SportsStore-08,部署到IIS服务器

SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管理.图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离.本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能. 本篇为系列第八篇,包括: ■ 10.部署到IIS服务器    □ 10.1 使用Visual Studio发布   

MVC项目实践,在三层架构下实现SportsStore-05,实现导航

SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管理.图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离.本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能. 本篇为系列第五篇,包括: ■ 8.导航 8.导航 创建NavController,派生于BaseController:

MVC项目实践,在三层架构下实现SportsStore-04,实现分页

SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管理.图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离.本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能. 本篇为系列第四篇,包括: ■ 7.添加分页 7.添加分页 关于分页,是一系列的a标签,可以通过扩展HtmlHelper

MVC项目实践,在三层架构下实现SportsStore-06,实现购物车

SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管理.图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离.本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能. 本篇为系列第六篇,包括: ■ 8.购物车    □ 8.1 购物车模型 购物车帮助类    □ 8.2 添加"

MVC项目实践,在三层架构下实现SportsStore-07,实现订单提交

SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管理.图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离.本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能. 本篇为系列第七篇,包括: ■ 9.实现订单提交 9.实现订单提交 首先在购物车显示页面Cart/Index.cshtm