ASP.NET MVC站点中的覆盖视图不起作用

时间:2015-02-05 15:55:10

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-5 razorgenerator

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

假设 B 是基本控制器,其中非抽象操作方法 SomeAction 返回View(“_ MyView”)。使用RazorGenerator编译 _MyView.cshtml

让我们说控制器 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 ,还适用于其他所有控制器继承 的

3)重写SomeAction以返回base.SomeAction()不起作用

更新

我在这里找到了类似的问题,但是这个建议没有发生 RazorGenerator Issues

我发布了自己的问题here

提前谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

如果遇到此问题,您需要更新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包时遇到了这个问题,似乎该文件被过度压缩,将其重置为默认行为。