参考
环境
Win7 IIS6 VS2015
.Net Framework4.5.1
原因
暂时不想用MVC重构这个WebForm代码
1. 给WebForm项目添加引用
// 主要
System.Web.Razor
System.Web.Abstractions
System.Web.Mvc
System.Web.WebPages
// 可能还有
System.Web.Optimization
System.Web.Routing
Newtonsoft.Json
2. 将MVC项目的部分文件拷贝到WebForm项目
拷贝Controllers和Views,也许还有content(我将样式复制到了APP_Theme下),scripts。Views似乎是必须的,也不能改名字,拷贝到根目录下。
Controllers等代码需要拷贝到APP_CODE。
3. 修改web.config文件配置
主要将MVC项目的web.config内容添加到WebForm的web.config文件中,不要删除WebForm的原有设置,在对应节点后面加上MVC的内容即可。
<!-- WebForm的web.config文件需要加的内容,即MVC的设置,大致如下 -->
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
</configSections>
<appSettings>
<add key="webpages:Enabled" value="false" />
</appSettings>
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization" />
<add namespace="System.Web.Routing" />
<add namespace="System.Linq" />
<add namespace="System.Collections.Generic" />
</namespaces>
</pages>
</system.web.webPages.razor>
<system.web>
<compilation debug="true" targetFramework="4.5.1">
<assemblies>
<add assembly="System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>
<httpRuntime targetFramework="4.5.1" />
<pages>
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization" />
<add namespace="System.Web.Routing" />
<add namespace="System.Linq" />
<add namespace="System.Collections.Generic" />
</namespaces>
</pages>
</system.web>
<system.webServer>
<!-- 必要,没有MVC获取不到请求,modules节点唯一,如果有了,把 runAllManagedModulesForAllRequests="true" 属性加上就行 -->
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
</configuration>
4. 修改Global.asax文件及路由设置
<!-- Global.asax -->
<%@ Application Language="C#" %>
<%@ Import Namespace="System.Web.Routing" %>
<%@ Import Namespace="System.Web.Mvc" %>
<%@ Import Namespace="System.Web.Optimization" %>
<%@ Import Namespace="AppStart" %><!-- App_Start 里面BundleConfig.cs、RouteConfig.cs等的命名空间-->
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
//AreaRegistration.RegisterAllAreas(); 一定要去掉
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
// ……
// 这里即可用当做MVC的Global.asax.cs里的启动方法用
}
</script>
/*RouteConfig.cs*/
using System.Web.Mvc;
using System.Web.Routing;
namespace AppStart { // 这里命名空间记得改成自己的
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//避免aspx页面的请求传递给控制器
routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
routes.MapPageRoute("Home", "", "~/Default.aspx"); // 设置原来的主页为默认路径
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
小结
基本是把MVC的东西复制过来,注意的是引用、复制代码到App_Code、设置内的runAllManagedModulesForAllRequests
、aspx的路由