在混合 MVC3 项目中,剃刀视图优先于 aspx

Posted

技术标签:

【中文标题】在混合 MVC3 项目中,剃刀视图优先于 aspx【英文标题】:Priority of razor views over the aspx in mixed MVC3 project 【发布时间】:2012-04-26 15:34:06 【问题描述】:

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

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

通常当Index Action 调用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 视图,尽管我有正确的路径。是不是很奇怪?

【问题讨论】:

【参考方案1】:

您遇到的问题是 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 视图。

一个解决方案是Get MVC Razor favor .cshtml over .aspx,但是此解决方案不会重新关联 aspx/ascx 文件。所以你需要这样的东西:

protected void Application_Start() 
 
  ViewEngines.Engines.Clear(); 
  ViewEngines.Engines.Add(new RazorViewEngine()); 
  ViewEngines.Engines.Add(new WebFormViewEngine()); 
 

【讨论】:

现在唯一的小问题是:如果您安装了 resharper 并尝试从控制器打开关联的视图,它仍然会指向共享视图。虽然 Visual Studio 的“Go to View”会打开正确的 听起来你应该让 resharper 知道这个错误,因为这绝对是一个错误。

以上是关于在混合 MVC3 项目中,剃刀视图优先于 aspx的主要内容,如果未能解决你的问题,请参考以下文章

MVC2,MVC3,MVC4和MVC5的不同

如何将数据从剃刀视图传递到 mvc3 中的控制器?

asp.netMVC3.0框架,怎样在视图层的页面使用jquery EasyUI

asp.net mvc3.0中视图引擎razor和ASPX可以交互使用吗

MVC 3 在 IEnumerable 模型视图中编辑数据

Bootstrap 样式优先于自定义 CSS