在混合 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。
假设我有一个与控制器关联的视图(HomeController
、Index
操作和~\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的主要内容,如果未能解决你的问题,请参考以下文章
asp.netMVC3.0框架,怎样在视图层的页面使用jquery EasyUI