你的位置:首页 > ASP.net教程

[ASP.net教程]21、ASP.NET MVC入门到精通——ASP.NET MVC4优化


本系列目录:ASP.NET MVC4入门到精通系列目录汇总

删除无用的视图引擎

默认情况下,ASP.NET MVCE同时支持WebForm和Razor引擎,而我们通常在同一个项目中只用到了一种视图引擎,如Razor,那么,我们就可以移除掉没有使用的视图引擎,提高View视图的检索效率。在没有删除WebForm引擎之前,检索控制器中不存在的视图时,我们可以从下图看到,检索视图的顺序是先Home目录下面,然后Shared目录下面的aspx、ascx文件。

1、在Global.asax中添加如下代码:

void RemoveWebFormEngines()    {      var viewEngines = ViewEngines.Engines;      var webFormEngines = viewEngines.OfType<WebFormViewEngine>().FirstOrDefault();      if (webFormEngines != null)      {        viewEngines.Remove(webFormEngines);      }    } protected void Application_Start()    {      RemoveWebFormEngines(); //移除WebForm视图引擎      AreaRegistration.RegisterAllAreas();      WebApiConfig.Register(GlobalConfiguration.Configuration);      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);      RouteConfig.RegisterRoutes(RouteTable.Routes);      BundleConfig.RegisterBundles(BundleTable.Bundles);      AuthConfig.RegisterAuth();    }

现在再看下

压缩合并Css和Js

在APS.NET MVC4中,App_Start文件夹下面多了一个BundleConfig.cs类,专门用于压缩文件的,默认情况下压缩功能是开启的,当然我们也可以使用 BundleTable.EnableOptimizations = true;来显示设置开启。

注意要在Web.config中将 调试设置为false,压缩才会生效  <compilation debug="false" targetFramework="4.5" />

 bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery.min.js", "~/Scripts/jquery.easyui.min.js"));// "~/Scripts/jquery-{version}.js",
bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/themes/default/easyui.css", "~/Content/themes/icon.css"));//"~/Content/site.css",

我们来看下压缩合并前和压缩合并后的对比

压缩合并前:

压缩合并后

 

很明细,我们看到文件被合并了,减少了网络请求数,同时,文件的大小也减小了,说明被压缩处理了。

注意:我们只能合并同一类型的文件,也就是说不能把js和css文件合并到一起,只能单独合并js文件和css文件。

使用防伪造令牌来避免CSRF攻击

对表达提交来说,要关注的就是安全问题。ASP.NET MVC提供了探测某种攻击类型的机制,其中一种措施就是防伪造令牌。这种令牌包含服务器端和客户端组件,代码会在表单中插入一个隐藏域以保存用户特定的令牌 @Html.AntiForgeryToken()

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {  @Html.AntiForgeryToken()

而且服务器端会优先在数据处理之前执行这些令牌验证代码,如下:[ValidateAntiForgeryToken]

    [HttpPost]    [AllowAnonymous]    [ValidateAntiForgeryToken]    public ActionResult Login(LoginModel model, string returnUrl)    {      if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))      {        return RedirectToLocal(returnUrl);      }      // 如果我们进行到这一步时某个地方出错,则重新显示表单      ModelState.AddModelError("", "提供的用户名或密码不正确。");      return View(model);    }