我的第一个asp.net webform网站增加对MVC支持的历程

来源:互联网 发布:w 是什么矩阵 编辑:程序博客网 时间:2024/05/22 06:41

中间百度,google了无数次,由于是业余时间弄,费了一周多的时间才搞定,不多说闲话,直接开始。


为WebForm项目添加引用

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目录,是自己开发的,可以不必理会):

image

由于是第一次做,选最简单的,严格按照默认的MVC各种目录从其他项目中挪过来。

配置Web.config文件

原有WebForm的Web.config中的节点不要随便动,将下面的config内容中各个节点添加到原有的Web.config文件中

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>

appSettings节点增加:

<add key="webpages:Enabled" value="false"/>

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>



system.webServer节点下增加:

<modules runAllManagedModulesForAllRequests="true"/>


注册路由

在App_Start文件夹底下增加RouteConfig.cs类,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void RegisterRoutes(RouteCollection routes)
        {
            //避免对 Web 资源文件(例如 WebResource.axd 或 ScriptResource.axd)的请求传递给控制器 
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
            //避免aspx页面的请求传递给控制器
            routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
 
            //MVC路由注册
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
 
        }

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

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

RouteConfig.RegisterRoutes(RouteTable.Routes);


编译时出现:

缺少编译器要求的成员“Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create”rztong F:\rongzitong\rztong\Controllers\HomeController.cs

经过百度,在stackoverflow找到答案,需要引用Microsoft.Charp.dll文件

然后编译通过。


运行网站是出现错误:

未能加载文件或程序集“System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件

经过多方查找,找到解决 办法如下:

打开packages.config,增加各种依赖项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<packages>
  <package id="Antlr" version="3.4.1.9004" targetFramework="net452" />
  <package id="dotless" version="1.5.2" targetFramework="net452" />
  <package id="jQuery" version="1.10.2" targetFramework="net452" />
  <package id="jQuery.Easing" version="1.3.0.1" targetFramework="net452" />
  <package id="jQuery.Validation" version="1.15.1" targetFramework="net452" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.Mvc.zh-Hans" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.Razor.zh-Hans" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.Web.Optimization.zh-Hans" version="1.1.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Client.zh-Hans" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Core.zh-Hans" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.WebHost.zh-Hans" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebPages.zh-Hans" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.jQuery.Unobtrusive.Ajax" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net452" />
  <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net452" />
  <package id="Senparc.Weixin" version="4.11.9" targetFramework="net452" />
  <package id="Senparc.Weixin.MP" version="14.3.142" targetFramework="net452" />
  <package id="WebGrease" version="1.5.2" targetFramework="net452" />
  <package id="X.PagedList" version="1.22.5.150" targetFramework="net452" />
  <package id="X.PagedList.Mvc" version="4.8.0.100" targetFramework="net452" />
</packages>

然后在pachages.config所在的项目中执行:

update-package -reinstall对包进行还原

然后上面的那个错误没有了。报了一个view文件夹下web.config中一个引用错误。解决后又提示

未找到分部视图

这样的错误。这是由于view文件夹下的文件是从其他项目拷贝过来的,有些文件没拷贝过来造成的。重新按提示进行拷贝,然后刷新,打开网站首页不是原来的index.aspx,而是路由设置中的home/index。这问题很清楚,是IIS网站设置的默认首页不起作用了。而是按照global.aspx中设置的路由来寻找的。这个怎么解决才能使其打开网站的首页仍然是原来的index.aspx呢。于是各种寻找解决办法。

找到三种解决办法:

方法1:

在Global.asax文件中增加

protected void Application_BeginRequest(object sender, EventArgs e)
{
    if (Context.Request.FilePath == "/") Context.RewritePath("Default.html");
}

方法2:

新建一个路由DefaultController,并把它设置为默认路由,在Action中增加

Redirect(Url.Content("~/Default.html"));

方法三:

在global.aspx增加新路由。

//路由到默认的webform首页/index.aspxroutes.MapPageRoute("default_page""""~/index.aspx");

​这三个方法自然是选第三个了。上边两个方法有点违和,不是用路由设置规则来实现的。

由于我的路由设置规则是在RouteConfig.cs类中放的,因此上边的新路由规则也放到routeconfig.cs中。

并且由于mvc的路由规则是自上而下寻找,找到第一个匹配便不在往下寻找,因此这个路由应该放到设置的

//MVC路由注册           routes.MapRoute(               name: "Default",               url: "{controller}/{action}/{id}",               defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }           );

路由上边。因此放好后编译执行,没问题了,打入域名,定位到了首页index.aspx。而且也不影响使用/home/index访问mvc相关页面。


0 0
原创粉丝点击