混合MVC3项目中对aspx的razor视图的优先级

iLe*_*ing 1 c# asp.net-mvc asp.net-mvc-3

我已经将旧的MVC2项目转换为MVC3.现在我有.aspx视图和razor .cshtml.

假设我有一个与控制器(HomeController,Index动作和~\Views\Home\Index.aspx)相关的视图,同时我仍然有完全不同 的观点~\Views\Shared\Index.aspx.

通常在IndexAction调用View()它渲染时~\Views\Home\Index.aspx.但是,如果我将视图转换为剃刀视图,则执行相同的操作而不是渲染~\Views\Home\Index.cshtml调用 ~\Views\Shared\Index.aspx.

所以我猜MVC优先考虑.aspx页面而不是.cshtml.也许我需要在web.config文件中更改一些内容,因为现在我必须明确告诉它要获取哪个视图:

View("~\Views\Home\Index.cshtml")
Run Code Online (Sandbox Code Playgroud)

即使我删除了扩展名,View("~\Views\Home\Index")它仍会调用共享的.aspx视图,尽管我有正确的路径.奇怪不是吗?

Eri*_*ips 5

您遇到的问题是MVC视图的默认优先级.这是默认值:

~/Views/Home/Index.aspx
~/Views/Home/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/Home/Index.cshtml
~/Views/Home/Index.vbhtml
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml 
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它支持所有aspx/ascx文件,即使在共享目录中也是如此,在类似的razor视图之前.

一个解决方案是让MVC Razor支持.cshtml优于.aspx,但是这个解决方案并没有重新关联aspx/ascx文件.所以你需要这样的东西:

protected void Application_Start() 
{ 
  ViewEngines.Engines.Clear(); 
  ViewEngines.Engines.Add(new RazorViewEngine()); 
  ViewEngines.Engines.Add(new WebFormViewEngine()); 
} 
Run Code Online (Sandbox Code Playgroud)