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

81 篇文章 2 订阅
5 篇文章 0 订阅

中间百度,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.aspx
routes.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相关页面。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值