添加asp.net mvc到现有的asp.net web form 应用程序
前言
asp.net mvc的前一版本为asp.net web Form(Asp.net mvc之前称为asp.net),其第一个版本与2002年年初发布。asp.net web form 属于.net框架的一部分。在接下来的十余年,asp.net web form框架稳步发展,不去越来越多的网站均采用asp.net 框架。几年后,新的web开发框架asp.net mvc 发布。如果想将asp.net mvc添加到现有的asp.net web form 系统中怎么办呢?
正文
如果想避免风险,想尽量少的更改应用程序,可以考虑使用asp.net mvc功能增强现有的asp.net web form 应用程序。也就是不让asp.net mve接管程序,只是让他来处理某些特定请求。使用此方法,我们要通过注册特定路由规则来定义那些请求有asp.net mvc处理
为了让现有的应用程序吧请求路由到asp.net mvc ,需要做一下配置:
1.将System.Web.Mvc和System.Web.Razor程序集添加到应用程序的引用里
2.在web.config配置文件的根目录System.Web---Compilation---Assemblies中添加配置
<system.web> <compilation debug="true" targetFramework="4.0" > <assemblies> <add assembly="System.Web.Mvc,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Web.WebPages,Version=2.0.0.0,Culture=neutral,PublicKeyToken=31BF3856AD364E35"/> </assemblies> </compilation> ...... </system.web>
3.在应用程序根目录创建一个/Views文件夹。因为ViewFactory会想asp.net mvc应用程序一样来查找相同的物理文件路径
创建/Views/Shared文件夹,保存全部共享视图文件
从现有的asp.net mvc网站复制/Views/web.config文件。次文章注册了Razor文件类型处理程序,并告诉IIS,次文件夹下的文件内部应用程序仅供内部应用程式使用和不向外开放(外部请求时IIS返回404提示信息)
/Views/web.config文件:
<?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=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> </sectionGroup> </configSections> <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.Routing" /> </namespaces> </pages> </system.web.webPages.razor> <appSettings> <add key="webpages:Enabled" value="false" /> </appSettings> <system.web> <httpHandlers> <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/> </httpHandlers> <!-- 在视图页面中启用请求验证将导致验证在 控制器已对输入进行处理后发生。默认情况下, MVC 在控制器处理输入前执行请求验证。 若要更改此行为,请对控制器或操作 应用 ValidateInputAttribute。 --> <pages validateRequest="false" pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <controls> <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" /> </controls> </pages> </system.web> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <handlers> <remove name="BlockViewHandler"/> <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" /> </handlers> </system.webServer> </configuration>
4.(可选)创建一个用于存放asp.net mvc控制器的Controllers文件夹,位置可以随意
5.在定义HttpApplication的类中添加路由配置(一般在Global.asax.cs文件中)。从技术角度看,使用了与asp.net mvc的相同的api来注册路由。在这个场景中根本区别是,相同的URL对应两个出来框架
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Routing; using System.Web.Security; using WebApplication1; namespace WebApplication1 { public class Global : HttpApplication { void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 AuthConfig.RegisterOpenAuth(); Linkin.WebUI.RouteConfig.RegisterRoutes(RouteTable.Routes); } void Application_End(object sender, EventArgs e) { // 在应用程序关闭时运行的代码 } void Application_Error(object sender, EventArgs e) { // 在出现未处理的错误时运行的代码 } } }
路由配置:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace Linkin.WebUI { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } }
以上只是简单的理解,更详细的内容请参考《asp.net mvc4 web编程》书