0

私は MvcSiteMapProvider の初心者です。残念ながら、自分で答えを見つけることはできません。MVC4 と MvcSiteMapProvider を使用しています 私の質問:

1) リンク購入 (および購入->検索) はローカルホストにリンクしますが、localhost/購入/検索でなければなりません

2) Toy/Toy-Details/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>
       }
    }
 }
4

1 に答える 1

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 スキームについて言及していないため、これ以上具体的には言えません。

リンクToy/Toy-Details/1は「購入」メニューに属していません

「購入」ノードの下にリストされていない理由は、動的ノード プロバイダーが「ToyBuy」の親キーを持つノードを指定していないためです。

通常、ダイナミック ノードはメイン カテゴリの下に指定します。検索機能に移動するときは、単一​​のノードを使用できます。preserveRouteParameters 属性を使用して、各カスタム ルート パラメーター (検索語句など) を指定できます。これにより、現在の要求からノードに値がコピーされ、毎回ノードと一致するように強制されます。

ホーム > 検索

次に、検索ページから特定の検索項目に移動すると、カテゴリ (この場合はToyBuy) の下にリストされている項目ページに移動します。

ホーム > 購入 > アイテム

preserveRouteParameters を使用したダウンロード可能なデモについては、How to Make MvcSiteMapProvider Rememeber a User's Position を参照してください。

また、Toy-Details は SiteMap に含まれないことに注意してください。DynamicNodeProvider を宣言するノードは単なるテンプレート ノードであり、すべての DynamicNodes がデフォルトでその属性を取得します。

于 2013-11-16T03:45:21.040 に答える