MVC HtmlHelper with Context Sensitive Partial Rendering

本文关键字:Partial Rendering Sensitive Context HtmlHelper with MVC | 更新日期: 2023-09-27 18:35:54

我尽可能多地查找信息,但我想没有人试图完全按照我在这里做的事情(我认为同样的事情可以通过视图中的 if 语句来完成,但我正在尝试减少我的项目中需要的复制代码量)。

所以这就是交易,我想使某些 Html.Partial() 调用对备用视图敏感。

public static MvcHtmlString DedicatedPartial(this HtmlHelper htmlHelper, string partialViewName)
{
    string dedicatedView;
    if (ViewExists(partialViewName, htmlHelper, out dedicatedView))
    {
        return htmlHelper.Partial(dedicatedView);
    }
    return htmlHelper.Partial(partialViewName);
}

以及

private static bool ViewExists(string partialViewName, HtmlHelper helper, out string dedicatedView)
{
     var urlPattern = partialViewName.Split('/');
     var clientCode = UserHelper.GetClientCode();
     dedicatedView = string.Format("ViewsDedicated/{0}/{1}", clientCode, urlPattern[0].ToCharArray()[0] == '~'
        ? urlPattern[2]
        : urlPattern[1]);
     return ViewEngines.Engines.FindView(helper.ViewContext, dedicatedView, null).View != null;
}

在我想使用的视图中,

<div>
    @Html.DedicatedPartial("~/Views/Something.cshtml")
</div>

根据登录用户的上下文,我想吐出一个替代视图(不更改上下文),以便基本上所有内容都保持不变,除了使用不同的视图代替预期的视图。

<div>
    @Html.Partial("~/DedicatedViews/DEDICATED/Something.cshtml")
</div>

似乎有时在执行代码时起作用(它尚未进入分支)。然而!有时当它尝试执行较低的return htmlHelper.Partial(partialViewName);时,我会收到异常

错误:

Section or group name 'system.web.webPages.razor' is already defined. Updates to this may only occur at the configuration level where it is defined.

感谢您的帮助!

编辑:

多亏了下面的建议,我才能够发现我确实以一种糟糕的方式处理解决方案(创建一个帮助程序来管理 ViewEngine 可以更恰当地处理的内容)。我应该补充一点,事实证明该错误实际上是我测试的副作用,因为有另一个 ViewEngine 试图创建一个单独的实例来尝试处理渲染。这种干扰导致了不太有用的错误。

长话短说:使用 ViewEngine 管理复杂的项目目录结构。

MVC HtmlHelper with Context Sensitive Partial Rendering

我不确定您要做什么,但是当您使用部分时,您无需指定完整路径。因此,也许您想将逻辑更改为仅基于名称进行搜索,而不基于路径和扩展名。

@Html.DedicatedPartial("Something")

实现一个可以将模型传递到分部视图的版本可能也很有用。

事实上,我认为你最好的选择是创建自己的视图引擎。如果继承默认 Razor 引擎,则可以指定搜索路径并确定专用视图文件夹的优先级。然后只需使用 Html.Partial