DynamicNodeProvider生成不正确的url

时间:2013-11-15 09:13:09

标签: asp.net-mvc asp.net-mvc-4 mvcsitemapprovider

我是MvcSiteMapProvider的新手。遗憾的是我自己找不到答案。 我使用MVC4和MvcSiteMapProvider 我的问题:

1)链接Buy(和Buy-> Search)将我链接到localhost但它必须是localhost / Buy / Search

2)玩具/玩具详细信息/ 1链接不属于“购买”菜单(如果我到达此链接菜单购买 - >搜索消失)请提前感谢您。

我的Mvc.sitemap:

<mvcSiteMapNode title="Home"
  controller="Toy"
  action="Index"
  key="Home">
<mvcSiteMapNode title="Buy"
  controller="Toy"
  action="Search"
  key="ToyBuy">
<mvcSiteMapNode title="Search"
  controller="Toy"
  action="Search"
  key="ToySearch">
<mvcSiteMapNode title="Toy Search Result"
    controller="Toy" action="Search-Result"
    key="ToySearchResult">
  <mvcSiteMapNode title="Toy Details"
      controller="Toy"
      action="Toy-Details"
      key="ToyDetail" dynamicNodeProvider="MyToys.Web.DynamicNodeProviders.ToySearchDynamicNodeProvider,MyToys.Web"/>
  </mvcSiteMapNode>
</mvcSiteMapNode>
<mvcSiteMapNode title="Publish" controller="Toy" action="Publish" description=""/>
<mvcSiteMapNode title="Published" controller="Toy" action="Published" key="ToyPublished" description="">
<mvcSiteMapNode title="Edit" controller="Toy" action="Edit"
      preservedRouteParameters="id" key="ToyPublishedEdit" visibility="false" description=""/>
</mvcSiteMapNode>

和ToySearchDynamicNodeProvider:

public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
{
  var rep = new ToyRepository();
  foreach (var Toy in rep.Get())
  {
    DynamicNode dynamicNode = new DynamicNode();
    dynamicNode.ParentKey = "ToySearchResult";
    dynamicNode.RouteValues.Add("id", Toy.ID);
    yield return dynamicNode;
  }
}

顺便说一下,我还重写了MenuHelperModel.cshtml:

<div class="hmenu">
  <ul class="tabs">
    @foreach (var node in Model.Nodes)
    {
       <li>@Html.DisplayFor(m => node)</li>
    }
  </ul>
 </div>
 @foreach (var node in Model.Nodes)
 {
     if (node.IsInCurrentPath)
     {
       if (node.Children.Any()) 
       {
         <div class="vmenu">
           <ul class="tabs">
              @foreach (var child in node.Children)
              {
                 <li><a href="@child.Url">@child.Description</a></li>
              }
           </ul>
         </div>
       }
    }
 }

1 个答案:

答案 0 :(得分:2)

购买(和购买 - >搜索)

MvcSiteMapProvider使用与MVC框架的其余部分相同的MVC UrlHelper类来生成URL。创建URL的方式取决于您的路由配置。有几种资源可用于帮助您配置MVC路由。这里有几个。

http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/asp-net-mvc-routing-overview-cs http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx http://msdn.microsoft.com/en-us/library/cc668201.ASPX

我不能比这更具体,因为你没有提到你想要生成的URL方案。

玩具/玩具详细信息/ 1链接不属于“购买”菜单

它未列在“购买”节点下的原因是因为您的动态节点提供程序未指定父键为“ToyBuy”的任何节点。

通常,您需要在其主类别下指定动态节点。转到搜索功能时,您可以使用单个节点。您可以使用savedRouteParameters属性指定每个自定义路由参数(例如,搜索项),这些参数会将当前请求中的值复制到节点,并强制它每次都与节点匹配。

主页&gt;搜索

然后,当从搜索页面导航到特定搜索项目时,它会转到该类别下列出的项目页面(在本例中为ToyBuy)。

主页&gt;购买&gt;项目

有关使用savedRouteParameters的可下载演示,请参阅How to Make MvcSiteMapProvider Rememeber a User's Position

另请注意,玩具详细信息不会出现在SiteMap中。声明DynamicNodeProvider的节点只是一个模板节点,默认情况下,所有DynamicNodes都采用其属性。