1

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

假设我有一个与控制器(HomeControllerIndex动作和~\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")

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

4

1 回答 1

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 

如您所见,它优先于所有 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()); 
} 
于 2012-04-26T15:51:05.427 回答