【发布时间】:2016-07-15 06:41:15
【问题描述】:
我正在使用 C# 注释配置 MvcSiteMapProvider,而不是通过 XML。我根据文档实现了一个自定义可见性提供程序。我从FilteredSiteMapNodeVisibilityProvider 派生我的课程:
public class CustomVisibilityProvider: FilteredSiteMapNodeVisibilityProvider
{
public override bool IsVisible(ISiteMapNode node, IDictionary<string, object> sourceMetadata)
{
if (node.Attributes.Keys.Contains("customVisibility"))
{
string customVisibility = (string)node.Attributes["customVisibility"];
if (!string.IsNullOrEmpty(customVisibility))
{
customVisibility = customVisibility.Trim();
...
var criteria = ...
return criteria && base.IsVisible(node, sourceMetadata);
}
}
return base.IsVisible(node, sourceMetadata);
}
}
我的控制器的视图:
[MvcSiteMapNode(Title = "My View", ParentKey = "ParentController", Key = "MyView", Order = 922, PreservedRouteParameters = "id", Attributes = @"{ ""Visibility"": ""SiteMapPathHelper,!*"" }")]
public ActionResult MyView(int? id)
{
return ViewForEntity(id);
}
正如我们所见,我没有在此视图中使用自己的 customVisibility 属性,但我想使用标准的 Visibility 属性。此特定视图不应出现在菜单或其他地方,SiteMap 除外。
问题在于,当检查此视图的 SiteMapNode 在菜单中的可见性(又名(string)sourceMetadata["HtmlHelper"] == "MvcSiteMapProvider.Web.Html.SiteMapPathHelper")时,base.IsVisible(node, sourceMetadata) 返回true。我希望FilteredSiteMapNodeVisibilityProvider 将处理Visibility 属性并返回false,因为这个视图应该只出现在站点地图中。
作为一种解决方法,我目前实施了自己的检查:
private bool checkDefaultVisibility(ISiteMapNode node, IDictionary<string, object> sourceMetadata)
{
bool defaultVisibility = sourceMetadata["HtmlHelper"] == null || !node.Attributes.Keys.Contains("Visibility");
if (sourceMetadata["HtmlHelper"] != null && node.Attributes.Keys.Contains("Visibility"))
{
var htmlHelper = (string)sourceMetadata["HtmlHelper"]; // Example: "MvcSiteMapProvider.Web.Html.SiteMapPathHelper"
var helpersRules = ((string)node.Attributes["Visibility"]).Split(',');
foreach(var helperRule in helpersRules)
{
if (helperRule != "!*" && htmlHelper.EndsWith("." + helperRule))
{
defaultVisibility = true;
break;
}
}
}
return defaultVisibility;
}
这是我的自定义可见性提供程序的一种方法。我讨厌它,因为它不是通用的,只处理特定情况。同时我不想在这里重新发明轮子。我希望Visibility 由MvcSiteMapProvider 内部处理。如何实现?
【问题讨论】:
-
题外话:感谢您的提问,我意识到visibility provider documentation 是不完整的,并已对其进行了更新和改进。
标签: c# asp.net-mvc-5 mvcsitemapprovider