将 MVC 架构注入 ASP.NET Web Forms 应用程序






3.63/5 (5投票s)
如何在旧的 ASP.NET Web Forms 应用程序中使用 ASP.NET MVC 架构。
引言
首先,不要将注入一词与依赖注入混淆。它仅仅意味着我将在 ASP.NET web forms 应用程序中使用 MVC 架构。
我知道将 MVC 架构注入 ASP.NET 项目并不是什么大问题,但它在很多时候都能帮到我们。但现在这已经成为可能,我希望您一定会很高兴地学习到如何将 MVC 架构注入 ASP.NET,就像我当初一样!
背景
这篇文章主要对那些不得不使用 ASP.NET Web Forms 应用程序但又不太擅长 ASP.NET Web Forms 的开发者有用。
所以不用担心……我希望在读完这篇文章后,如果您也面临同样的问题,也能将相同的概念应用到您的应用程序中……:)
目录
- 引言
- 背景
- 我为什么要注入?
- ASP.NET MVC 架构简介
- 为什么选择 ASP.NET MVC 架构?
- 实现步骤
- 步骤 1:创建一个带 Web Forms 的示例项目。
- 步骤 2:在我们的示例项目中添加 MVC 所需的引用
- 步骤 3:添加 MVC 文件夹及其内容。
- 步骤 4:添加 MVC 默认 CSS 文件并在 _Layout.cshtml 中注册其引用
- 步骤 5:添加新的 Web.config 文件并更新旧的。
- 步骤 6:路由、脚本和 CSS 的注册文件。
- 步骤 7:运行项目。
- 示例项目代码
- 结论
我为什么要注入?
作为一个团队,我们总是会遇到一些问题,即有些开发者技术知识扎实,但由于技术的快速变化,我们很难跟上。所以,一个团队可能既有非常熟悉 ASP.NET 的成员,但又不熟悉 MVC;也有熟悉 ASP.NET MVC 但不熟悉 ASP.NET web forms 的成员。在这种情况下,我们需要一个环境,允许两类用户在同一个项目中以自己的方式开发模块。
这只是一个简单的可以注入的场景,但我们还有更多
- 紧耦合:它阻碍了代码可重用的概念。
- 在视图中处理数据不够灵活。
- 由于复杂的关系,单元测试难以处理。
所以在这里我们可以利用这两种架构的优势。
注意: 我并不是说我们总是要使用 MVC,但如果您真的想将 MVC 架构注入到您正在运行的 ASP.NET web forms 项目中,这是可以做到的。
ASP.NET MVC 简介
MVC(Model-View-Controller)无非是一种应用程序设计模式,其中每个组件都有自己的职责来开发应用程序。
模型 (Model):该组件负责维护状态,可以简单地理解为将数据从视图传递到控制器,或从控制器传递到视图。
视图 (View):该组件负责显示应用程序的用户界面。基本上,视图可以根据用户的请求使用模型的状态值在 UI 上显示。
控制器 (Controller):该组件负责处理最终用户的交互,在服务器上操作模型,并最终决定哪个视图必须在 UI 上渲染。
这些是实现 MVC 架构时必须遵循的简单 MVC 应用程序原则。所以 Microsoft 在 ASP.Net MVC 应用程序中引入了所有这些概念。
为什么选择 ASP.NET MVC 架构?
与 ASP.NET Web Forms 方法相比,ASP.NET MVC Framework 具有以下优势。我希望这不在讨论范围内,但我们可以稍微讨论一下。
紧耦合 è 关注点分离
ASP.NET Web Forms 方法的主要问题在于其代码隐藏文件的复杂性,即它会导致开发者使用紧耦合的概念。
而在 ASP.NET MVC 中,应用程序被划分为模型、视图和控制器组件,这使得开发者更容易管理应用程序的复杂性。
测试驱动应用程序开发 è 更好的支持
MVC 应用程序对测试驱动应用程序开发有更好的支持。
可重用性低 è 提高可重用性
ASP.NET MVC 应用程序组件被设计为可插入和可扩展的,因此比 Web Forms 更容易替换或自定义。
实现步骤
步骤 1:创建一个带 Web Forms 的示例项目
现在,在解决方案资源管理器中,我们只有一个 web.config 文件和一个 global.asax 文件,它们负责 ASP.NET web forms 应用程序的设置以及应用程序的启动方式。
步骤 2:在我们的示例项目中添加 MVC 所需的引用
现在,Asp.Net 应用程序没有 MVC 应用程序运行所需的所有引用,这就是为什么在接下来的步骤中我们需要在解决方案中添加这些引用的原因。
这些引用是(如果您的应用程序中已添加任何这些,请忽略)
System.Web.Mvc
System.Web.Razor
System.Web.Http
您可以通过以下步骤简单地添加这些引用
引用 => 添加引用 => 程序集 => 搜索相同的名称并选择有效版本,例如 4.0 => 点击确定
System.Web.Optimization
对于此引用,您需要安装 NuGet 包。有关更多详细信息,请遵循以下链接:
请参阅下面的截图,了解如何管理相同的 NuGet 包。
我将不详细解释这些程序集,因为我知道您是 MVC 开发者,您非常清楚这些程序集的用途。
添加完所有这些引用后,您可以在“引用”文件夹中进行确认:
步骤 3:添加 MVC 文件夹及其内容
为了注入 MVC 架构,我们需要添加 MVC 使用的所有文件夹,例如 App_Start、Controllers、Model 和 Views 等。
您可以直接创建一个空的 MVC 应用程序,然后将所有这些文件及其内容复制粘贴到您要注入的 ASP.NET 应用程序中。
在截图中,您可以找到所需的文件和文件夹。
步骤 4: 添加 MVC 默认 CSS 文件并在 _Layout.cshtml 中注册其引用
如果您想在正在运行的 ASP.NET Web Forms 应用程序中使用您的 MVC CSS 文件,只需将它们复制并粘贴到正在运行的应用程序中,并在 _Layout.cshtml 文件中设置它们的引用。
在我们的例子中,两个文件同名(Site.css),所以我将该文件重命名为 MVCSite.css 并复制了该文件。
步骤 5: 添加新的 web.config 文件并更新旧的。
为了获取所有 MVC 应用程序的设置,我们需要 MVC 应用程序的配置文件,即 Web.config 文件。
现在我们有两个 Web.config 文件
- Asp.net 默认的 &
- MVC 配置文件
许多新开发者会混淆这两个 web.config 文件,他们总是认为任何应用程序只能有一个 web.config 文件,但这并不属实。
我们可以在应用程序的不同目录中有多个 web.config 文件,但不能在同一个目录中有两个 web.config 文件。
在下面的截图中,我添加了 MVC web.config 文件。
现在您需要使用以下设置更新 ASP.NET Web Forms Web.config 文件。
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <connectionStrings> <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-AspWithMvcSample-20141229152959;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-AspWithMvcSample-20141229152959.mdf" /> </connectionStrings> <system.web> <compilation debug="true" targetFramework="4.0"> <!-- New --> <assemblies> <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </assemblies> </compilation> <authentication mode="Forms"> <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> </authentication> <profile defaultProvider="DefaultProfileProvider"> <providers> <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" /> </providers> </profile> <membership defaultProvider="DefaultMembershipProvider"> <providers> <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> </providers> </membership> <roleManager defaultProvider="DefaultRoleProvider"> <providers> <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" /> </providers> </roleManager> <sessionState mode="InProc" customProvider="DefaultSessionProvider"> <providers> <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" /> </providers> </sessionState> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true" /> </system.webServer> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> </entityFramework> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="AjaxControlToolkit" publicKeyToken="28f01b0e84b6d53e" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.1.51116.0" newVersion="4.1.51116.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
步骤 6:路由、脚本和 CSS 的注册文件
现在到了时候,我们要告诉 asp.net 引擎,您必须遵循一个新的路由来映射用户请求,就像在 MVC 中一样。这意味着我们也将为 MVC 模式注册路由。
请看下面的代码片段。
void Application_Start(object sender, EventArgs e) { // Code that runs on application startup AuthConfig.RegisterOpenAuth(); // Code for MVC routes RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); BundleConfig.RegisterBundles(BundleTable.Bundles); ///============================================ /// Commented out for now because not in use /// You can use these as per your requirement ///============================================ //AreaRegistration.RegisterAllAreas(); //WebApiConfig.Register(GlobalConfiguration.Configuration); //FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); }
我注释掉了其他内容,因为我将不使用它们。
步骤 7:运行项目。
只需创建一个简单的 aspx 页面,添加一个按钮,并在按钮点击事件中编写以下代码。
protected void btnRedirect_Click(object sender, EventArgs e) { Response.Redirect("/Home/Index"); }
这将重定向到 Home Controller 的 Index action 方法。
示例项目代码
我已将示例项目附加供您参考。您可以直接下载并使用示例代码及其设置到您的应用程序中。
结论
我希望现在您能够使用相同的机制将 MVC 注入到您的 ASP.NET web forms 应用程序中。如果您有任何疑问、问题或疑虑,请告诉我。我将很高兴收到并尽快回复您。