【问题标题】:MVC routing priority for shared views共享视图的 MVC 路由优先级
【发布时间】:2016-02-23 19:53:27
【问题描述】:

我的解决方案在不同文件夹位置共享具有相似名称的视图

~\Views\Shared\Discount.ascx
~\Views\Dashboard\Shared\Discount.ascx

我正在扩展 WebFormViewEngine 来定义一个用于路由的视图引擎

public class AreaViewEngine : WebFormViewEngine
{
    public AreaViewEngine() : base()
    {
        ViewLocationFormats = new[] {
            "~/Views/Shared/{0}.ascx",
            "~/Views/Dashboard/Shared/{0}.ascx"
        };

        MasterLocationFormats = new[] {
            "~/Shared/{0}.master"
        };

        PartialViewLocationFormats = ViewLocationFormats;
    }
}

这会导致名称相似的视图出现问题。如果 URL 包含 /Dashboard/

,我想为 ~/Views/Dashboard/Shared/{0}.ascx 设置更高的优先级

有人知道怎么做吗?还是知道处理这种情况的更好方法?

【问题讨论】:

    标签: c# asp.net-mvc routing


    【解决方案1】:

    您可以在自定义 ViewEngine 类中覆盖 FindView 方法,并在回退到默认行为之前查找包含 URL 片段的匹配项。

    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
        var fragment = ... // access URL via controllerContext
        var preferred = ViewLocationFormats.Where(x => x.Contains(fragment)).ToList();
        // return retult from preferred or fall back to base.FindView
    }
    

    不过,我不是这种方法的忠实拥护者。如果您需要一个视图是“可覆盖的”,您可以简单地使其输出有条件或依赖于模型值,例如通过将 DiscountView 属性添加到您的视图模型,然后使用此属性的值来决定您的视图应该发出什么.

    如果您想要的只是“巧妙的命名冲突处理”,那么我建议您改用 T4MVC。它允许您专门引用您的视图,而无需使用魔法字符串,从而解决多个同名视图可能导致的歧义。

    【讨论】:

    • 不确定如何“从首选返回结果”,但回退到 base.FindView 似乎正在使用一开始设置的格式。
    猜你喜欢
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多