0

当我将查询字符串传递给我的“详细信息”页面时,@Html.MvcSiteMap().SiteMapPath() 会查看我的 URL 中的最后一个参数,在 MVC 中是我传递的 ID,而不是页面姓名。它最终什么都没有显示。当它到达“详细信息”视图时,有没有办法以编程方式在我的控制器中设置 SiteMapPath()?

_Layout.cshtml:@Html.MvcSiteMap().SiteMapPath()

Mvc.站点地图:

<mvcSiteMapNode title="Search" controller="Vendor" action="Search" key="Vendor">
    <mvcSiteMapNode title="Search Results" controller="Vendor" action="SearchResults" key="Search">
      <mvcSiteMapNode title="Details" controller="Vendor" action="Details" key="Details"/>
    </mvcSiteMapNode>
  </mvcSiteMapNode>

注意:“搜索”和“搜索结果”页面完美运行。

/供应商/搜索工作。

/Vendor/SearchResults 有效。

/Vendor/Details/418 不起作用。

编辑:原来我需要的只是将preservedRouteParameters =“id”添加到我的mvcSiteMapNode,所以

<mvcSiteMapNode title="Details" controller="Vendor" action="Details" key="Details" preservedRouteParameters="id" />
4

1 回答 1

0

如果您想在搜索引擎中索引这些页面,您应该使用 dynamicNodeProvider 为每个可能的 Id(可能来自数据库)创建一个节点。

public class VendorDynamicNodeProvider 
    : DynamicNodeProviderBase 
{ 
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node) 
    {
        using (var db = new MyContext())
        {
            // Create a node for each album 
            foreach (var vendor in db.Vendors) 
            {    
                DynamicNode dynamicNode = new DynamicNode();
                dynamicNode.Title = vendor.Name;
                dynamicNode.ParentKey = "Vendors"; // Attach to a node that is defined somewhere else
                dynamicNode.RouteValues.Add("id", vendor.Id.ToString());

                yield return dynamicNode;
            }
        }
    } 
}

另一方面,如果您正在构建页面以编辑数据(CRUD 操作)和/或您不希望页面被搜索引擎索引,您可以使用preservedRouteParameters(正如您已经发现的那样)强制单个节点匹配每个可能的 id。

通常,当您这样做时,您还需要使用 SiteMapTitleAttribute 和 FilteredSiteMapNodeVisibilityProvider 来调整菜单和 SiteMapPath 的外观。有关完整示例,请参阅如何使 MvcSiteMapProvider 记住用户的位置

于 2013-11-02T07:47:32.550 回答