具有上下文敏感部分呈现的 MVC HtmlHelper
MVC HtmlHelper with Context Sensitive Partial Rendering
我尽可能多地查找了信息,但我想没有人尝试完全按照我在这里所做的去做(我认为同样的事情可以通过视图中的 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 管理复杂的项目目录结构。
我不确定您要做什么,但是当您使用 partial 时,您不需要指定完整路径。因此,也许您想将逻辑更改为仅根据名称进行搜索,而不是路径和扩展名。
@Html.DedicatedPartial("Something")
实现一个可以将模型传递给局部视图的版本可能也很有用。
事实上,我认为您最好的选择是创建您自己的视图引擎。如果您继承了默认的剃须刀引擎,您可以指定搜索路径并优先考虑您的专用视图文件夹。然后只需使用 Html.Partial
我尽可能多地查找了信息,但我想没有人尝试完全按照我在这里所做的去做(我认为同样的事情可以通过视图中的 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 管理复杂的项目目录结构。
我不确定您要做什么,但是当您使用 partial 时,您不需要指定完整路径。因此,也许您想将逻辑更改为仅根据名称进行搜索,而不是路径和扩展名。
@Html.DedicatedPartial("Something")
实现一个可以将模型传递给局部视图的版本可能也很有用。
事实上,我认为您最好的选择是创建您自己的视图引擎。如果您继承了默认的剃须刀引擎,您可以指定搜索路径并优先考虑您的专用视图文件夹。然后只需使用 Html.Partial