ASP.NET MVC 站点中的覆盖视图无法正常工作

Override view in ASP.NET MVC site not working

我的解决方案中有一个单独的项目,其中包含一些控制器和编译视图。 我将这些控制器用于我的 MVC 应用程序中的其他控制器 类,并且视图是使用 RazorGenerator.

编译的

假设 B 是具有非抽象操作方法 SomeAction 的基础控制器 returns View("_MyView") . _MyView.cshtml是使用RazorGenerator编译的。

假设控制器 A 继承了 B 但没有覆盖 SomeAction.

我试图制作另一个视图 "~/Views/A/_MyView.cshtml" 来覆盖默认视图,但它不起作用。我的问题是我怎样才能做到这一点?

附加信息

1) 我知道默认情况下会在这些路径中按该顺序搜索视图

"~/Views/{1}/{0}.cshtml",
"~/Views/{1}/{0}.vbhtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared/{0}.vbhtml"

2) 放置 "~/Views/Shared/_MyView.cshtml" 确实会覆盖视图,但不仅针对控制器 A,但也适用于继承的所有其他控制器 B

3) 将 SomeAction 覆盖到 return base.SomeAction() 不起作用

更新

我在这里发现了类似的问题,但是按照建议没有任何反应 RazorGenerator Issues

我已经发布了我自己的问题here

提前致谢!

到目前为止,我唯一的解决方法是在消费者应用程序上安装 RazorGenerator,并将视图 _MyView.cshtml 设置为 RazorGenerated。然后 RazorGenator 选择正确的视图。

其他访问者的另一个注意事项是不要将错误的视图混淆与去往基本控制器而不是消费者控制器的路由混合在一起。在较早解决此问题以能够找出正确的控制器作为 OP 提供的实际错误视图时,我遇到了问题。我的基础 application_start 中有删除路由重复项的代码。

遇到此问题的任何其他人需要更新 RazorGeneratorMvcStart.cs 以在主项目中设置 PreemptPhysicalFiles = false。默认情况下不是这种情况,主项目中的视图优先:

        var engine = new PrecompiledMvcEngine(typeof(RazorGeneratorMvcStart).Assembly)
        {
            UsePhysicalViewsIfNewer = HttpContext.Current.Request.IsLocal,
            PreemptPhysicalFiles = false
        };

        ViewEngines.Engines.Add(engine);

这个文件是App_Start\RazorGeneratorMvcStart.cs。添加引擎而不是插入引擎也很重要。默认是在位置0插入。

注意:我在更新 NuGet 包时遇到了这个问题,似乎文件被覆盖了,将其重置为默认行为。