MvcSiteMapProvider中的SiteMapTitle仅在痕迹中覆盖标题

时间:2014-10-16 09:30:29

标签: asp.net-mvc-5 mvcsitemapprovider

我希望覆盖站点地图节点的标题,但只能在面包屑中,而不是在菜单中。

    [Route("{partyAccountNumber}")]
    [SiteMapTitle("DisplayName", Target = AttributeTarget.CurrentNode)]
    public ActionResult Advice(string partyAccountNumber)

如何使用此重写标题,但仅在面包屑中,而不是在菜单中。

1 个答案:

答案 0 :(得分:0)

您可以通过直接编辑/Views/Shared/DisplayTemplates/SiteMapNodeModel.cshtml文件将条件逻辑放在标题上。

@model MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModel
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models

@* Conditionally set the title based on a custom attribute *@
@{ var title = Model.Title; }
@if (Model.SourceMetadata["HtmlHelper"].ToString() == "MvcSiteMapProvider.Web.Html.SiteMapPathHelper" &&
    Model.Attributes.ContainsKey("breadcrumbTitle") &&
    !string.IsNullOrEmpty(Model.Attributes["breadcrumbTitle"].ToString()))
{
    title = Model.Attributes["breadcrumbTitle"].ToString();
}

@if (Model.IsCurrentNode && Model.SourceMetadata["HtmlHelper"].ToString() != "MvcSiteMapProvider.Web.Html.MenuHelper")  { 
    <text>@title</text>
} else if (Model.IsClickable) { 
    if (string.IsNullOrEmpty(Model.Description))
    {
        <a href="@Model.Url">@title</a>
    }
    else
    {
        <a href="@Model.Url" title="@Model.Description">@title</a>
    }
} else { 
    <text>@title</text>
}

在您的节点上,您可以设置custom attribute以提供面包屑跟踪的备用值。如果需要,您还可以使用dynamic node provider从动态源(例如数据库)加载标题。

public class MyDynamicNodeProvider : DynamicNodeProviderBase
{
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
    {
        // Entities would be your entity framework context class
        // or repository.
        using (var entities = new Entities())
        {
            // Create a node for each item (data row in the table)
            foreach (var item in entities.Items)
            {
                DynamicNode dynamicNode = new DynamicNode();
                dynamicNode.Title = item.Title;

                // Provide a custom attribute for the breadcrumb title.
                dynamicNode.Attributes.Add("breadcrumbTitle", item.BreadcrumbTitle);
                dynamicNode.ParentKey = "Home";
                dynamicNode.Key = "Item_" + item.Id;
                dynamicNode.Controller = "Item";
                dynamicNode.Action = "Advice";

                // custom route values must be manually accounted for by using 
                // RouteValues or PreservedRouteParameters.
                dynamicNode.RouteValues.Add("partyAccountNumber", item.PartyAccountNumber);
                //dynamicNode.PreservedRouteParameters.Add("partyAccountNumber");

                yield return dynamicNode;
            }
        }
    }
}

然后将动态节点提供程序连接到节点配置中。

// Set a key explicitly to attach the dynamic nodes to. 
// The key property here corresponds to the ParentKey property of the dynamic node.
<mvcSiteMapNode title="Home" controller="Home" action="Index" key="Home">
    // Use a "dummy" node for the dynamic node provider. This node won't be in the SiteMap.
    <mvcSiteMapNode dynamicNodeProvider="NamespaceName.MyDynamicNodeProivder, AssemblyName"/>
</mvcSiteMapNode>