混合 MVC3 项目中剃须刀视图相对于 aspx 的优先级

本文关键字:相对于 aspx 优先级 视图 剃须刀 MVC3 项目 混合 | 更新日期: 2023-09-27 18:32:17

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

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

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

混合 MVC3 项目中剃须刀视图相对于 aspx 的优先级

您遇到的问题是 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 优先于 .aspx .cshtml,但是此解决方案不会重新关联 aspx/ascx 文件。所以你需要这样的东西:

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