本文转自:https://www.cnblogs.com/encoding/articles/3556046.html

  • 前言

掐指一算,3年没写博了,好懒的说。。。


众所周知,MVC现在越来越火了,不懂MVC的程序猿都不好意思说自己是搞网站开发的。

虽然MVC与WebForm各有所长,但是基于种种原因,很多用WebForm开发的网站需要转移到MVC上面来。但是,原有的系统上面有非常非常庞大的业务代码和页面代码,在实际工作中,不可能将一个WebForm开发的网站一次性全部转换到MVC框架中来,那么这个时候,就要用到本文说的:在WebForm中使用MVC。采用一个页面一个页面的方式,逐渐将整个网站全部转移到MVC中。


  • 为WebForm项目添加引用

要使用MVC,肯定要为项目添加MVC的引用,由于是我们自己操作,肯定不会像通过VS创建MVC项目那样引用一大篇的dll。必须引入的有以下几个:

System.Web.Abstractions;
System.Web.DynamicData;
System.Web.Mvc;
System.Web.Optimization;
System.Web.Razor;
System.Web.WebPages;
  • 建立MVC项目结构

使用MVC最大的一个好处就是细分了网站层,所以MVC中约定俗成的几个目录一个都不能少。Controllers、Views、Models、Scripts、Content几个文件是必须按照MVC项目结构搬移过来。

当然,Controllers和Models你可以自定义到其他dll中去,Scripts和Content你也可以使用自己的目录结构存放。但是Views必须放在根目录下,并且Views目录中结构必须如下图所示(Shared目录和目录中的文件不能少,_ViewStart、Web.config文件也不能少,至于Home目录,是自己开发的,可以不必理会):

  • 配置Web.config文件

原有WebForm的Web.config中的节点不要随便动,将下面的config内容中各个节点添加到原有的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>
<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.Routing"/>
<add namespace="System.Linq"/>
<add namespace="System.Collections.Generic"/>
</namespaces>
</pages>
</system.web.webPages.razor>
<system.web>
<compilation debug="true" targetFramework="4.5">
<assemblies>
<add assembly="System.Web.Razor, Version=2.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=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</assemblies>
</compilation>
<httpRuntime targetFramework="4.5" />
<pages>
<namespaces>
<add namespace="System.Web.Mvc"/>
<add namespace="System.Web.Mvc.Ajax"/>
<add namespace="System.Web.Mvc.Html"/>
<add namespace="System.Web.Routing"/>
<add namespace="System.Linq"/>
<add namespace="System.Collections.Generic"/>
</namespaces>
</pages>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>

关键是configSections、appSettings、system.web.webPages.razor三个节点,如果有丢失,那么cshtml文件将在开发时无法识别razor语法(运行时能够识别)。

system.web节点中的两段引用如果缺失,MVC页面将无法访问。

system.webServer中的<modules runAllManagedModulesForAllRequests="true"/>节点如果丢失,MVC页面将无法访问。

  • 注册路由

好了,结构搭建完成,现在要为MVC的路由进行注册了。

WebForm中有一个文件叫做全局应用程序类Global.asax,如果没有,就添加一个。

在Golbal.asax的Application_Start事件中,添加以下代码:

RouteCollection routes = RouteTable.Routes;

            //避免对 Web 资源文件(例如 WebResource.axd 或 ScriptResource.axd)的请求传递给控制器
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //避免aspx页面的请求传递给控制器
routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); //路由注册
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

怎么样,这段代码是不是很熟悉?不错,它就是MVC项目中App_Start目录下的RouteConfig.cs文件的RegisterRoutes方法代码。

  • 测试一下

来个gif动态图。

OK,收工。

懒惰,是一个通病。 努力,必会成为一种习惯。

[转]WebForm中使用MVC的更多相关文章

  1. WebForm中使用MVC

    http://www.cnblogs.com/encoding/articles/3556046.html ********************************************** ...

  2. 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数

    目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...

  3. 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

    原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...

  4. 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数,以及如何根据URL解析出匹配到MVC路由的Controller和Action

    目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...

  5. ASP.NET MVC IOC 之 Autofac(三)-webform中应用

    在webform中应用autofac,只有global中的写法不一样,其他使用方式都一样 nuget上引用: global中的写法: private void AutoFacRegister() { ...

  6. Mvc与WebForm优缺点及Mvc的使用

    关于Mvc与WebForm的优缺点在网上的评论可谓不胜枚举,但脱离了我们的项目来谈这些意义就不大了.以我们这次改版来看,WebForm的优势有以下几点: 一,可以使用<#include>, ...

  7. webform 中使用ajax

    常用的方式有 js –> WebService  , js->*.ashx, js->WebAPI, js->MVC Controller->Action. 前两种就不说 ...

  8. Ext.Net学习笔记01:在ASP.NET WebForm中使用Ext.Net

    Ext.Net是一个对ExtJS进行封装了的.net控件库,可以在ASP.NET WebForm和MVC中使用.从今天开始记录我的学习笔记,这是第一篇,今天学习了如何在WebForm中使用Ext.Ne ...

  9. ASP.NET WebForm中前台代码如何绑定后台变量

    转载自 http://www.cnblogs.com/lerit/archive/2010/10/22/1858007.html 经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题.一般有& ...

随机推荐

  1. LINQ to objects遇到的小坑

    1.C#中LINQ to Objects中延迟查询的陷阱(其他类型的LINQ也基本一致) 之前在不了解LINQ延迟查询的时候,我使用下面的这种方式,将where语句的结果直接as为List<T& ...

  2. asp.net MVC 统计在线人数功能实现

    今天开发一个设计一个统计在线人数的统计.实现方式是在MVC 中,用户次执行一个Action请求完成后,向数据表中插入一条用户心跳记录,统计在线人数则是根据该记录,30分钟内有记录的用户则为在线状态. ...

  3. BootStrap 4正式版发布(原文翻译)

    原文链接:http://blog.getbootstrap.com/2018/01/18/bootstrap-4/ 关于Bootstrap 什么是Bootstrap Bootstrap,来自 Twit ...

  4. [USACO5.1] 乐曲主题Musical Themes

    题目链接:戳我 Emmm......hash怎么做啊不会啊 这里是SA后缀数组版本的 就是先两两做差分,作为要处理后缀的数组.普通地求出来h数组之后,我们二分这个答案,然后判定是否合法就行了.是否合法 ...

  5. BroadcastReceive的使用

    一.注册方式 intent.setAction("BC_One"); 1.静态注册 <receiver  android:name = "继承BroadcastRe ...

  6. Elasticsearch Java API简介

    加入依赖 我本地的Elasticsearch的版本是2.1.0,因此加入相应的maven依赖 <dependency> <groupId>org.elasticsearch&l ...

  7. java对象的结构

    [Java对象解析]不得不了解的对象头 一个Java对象到底占用多大内存? JVM源码分析之java对象头实现 java对象在内存中的结构(转帖) 一个Java对象到底占多大内存? 在Hotspot ...

  8. 解决chrome无法启用印象笔记-剪藏功能

        新版Chrome浏览器安全的问题,导致从印象笔记官网下载的rxs(crx)文件无法直接通过drap&drop功能添加功能块.可以将rxs(crx)文件后缀名改成rar格式,然后解压,通 ...

  9. mysql中授权其它电脑链接指令。

    grant all privileges on yourDatabaseName to 'user'@'databaseIPAddress' identified by 'password' with ...

  10. 【HDU5126】 stars k-d树

    题目大意:有$m$个操作,分两种:在指定三维坐标内加入一个点,询问指定空间内点的数量. 其中$m≤5*10^{4},1≤x,y,z≤10^9$ 这题几乎就是裸的$k-d$树啊.我们动态维护一棵$k-d ...