中间百度,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目录,是自己开发的,可以不必理会):
由于是第一次做,选最简单的,严格按照默认的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相关页面。