前几天公司的阿三给我了一项艰巨的任务:码一个MVC4网站。本猿之前只用过MVC3,稍微看了下MVC4,有些地方都变了,如果用默认模板全新做一个MVC4网站得很小心,比如javascript的位置很容易爆出翔来。但好消息是,之前码MVC3的所有知识,都可以用在MVC4上,无需任何代码修改。

作为一个有梦想有目标的屌丝,我如果自己都没认真用过MVC4,以后在公司装逼就没底气了。所以,今天我正好休息在家,查了写资料,成功的把博客从MVC3升级到了MVC4。现在你看到的这个博客,就是稳定运行在MVC4上的。

首先,运行MVC4并不需要IIS8或.NET4.5。它完全能够部署在IIS7、IIS7.5上。所以我不用升级Target Framework的版本。只需要更新MVC4的相关DLL,以及一些config文件就可以完成升级。

按照 http://www.asp.net/whitepapers/mvc4-release-notes#_Toc303253806 的步骤来做。这篇东西目前只有英文版,所以我大致做了下翻译。

第一步:修改web.config

注意,默认的MVC3网站会有两个web.config文件。一个在网站根目录,另一个在Views目录下。这两个都要改。

在web.config中查找下面每一行代码:

System.Web.Mvc, Version=3.0.0.0
System.Web.WebPages, Version=1.0.0.0
System.Web.Helpers, Version=1.0.0.0
System.Web.WebPages.Razor, Version=1.0.0.0

然后替换为:

System.Web.Mvc, Version=4.0.0.0
System.Web.WebPages, Version=2.0.0.0
System.Web.Helpers, Version=2.0.0.0
System.Web.WebPages.Razor, Version=2.0.0.0

第二步:在站点根目录下的web.config里,将webPages:Version的属性改成"2.0.0.0",并增加一个新节点PreserveLoginUrl,设置属性为"true":

<appSettings>
  <add key="webpages:Version" value="2.0.0.0" />
  <add key="PreserveLoginUrl" value="true" />
</appSettings>

第三步:在VS的解决方案浏览器中,找到你的MVC网站,在引用(Reference)上点击右键,选择“管理NuGet包”(Manage NuGet Packages),在左边栏上选择"Updates\NuGet official package source"。(注:此处官方文档有误,不是Online分类里的)

然后升级下面的组件:

  • ASP.NET MVC 4
  • (可选) jQuery, jQuery Validation and jQuery UI
  • (可选) Entity Framework
  • (可选) Modernizr

第四步:在解决方案管理器上右击MVC项目名称,选择“Unload Project”,然后再右击一次,选择"Edit ProjectName.csproj"。

第五步:在ProjectTypeGuids节点下查找{E53F8FEA-EAE0-44A6-8774-FFD645390401},替换为{E3E379DF-F4C6-4180-9B81-6769533ABE47}

第六步:保存更改,然后再次右击MVC项目名称,选择Reload Project。

第七步:如果你的项目引用了三方类库,并且这些类库是针对老版本的MVC编译的话,打开站点根目录下的web.config,在configuration section下增加下面3个bindingRedirect元素:

<configuration>
  <!--... elements deleted for clarity ...-->
 
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" 
             publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" 
             publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="4.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" 
             publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>