0

MVC4 アプリケーションで MvcSitemapProvider を使用しています。データベース内の 1:n 関係を解決するためのパラメーターがコントローラー アクションに必要です。例: ショップ > アイテム > アイテムの詳細。ユーザーが ItemXYZ の詳細を見て、[Shop] > [ Item ] > [ItemDetails] をクリックするとします。アプリケーションに再度 ItemXYZ を表示させたいとします。したがって、MvcSitemapProvider は itemID を格納する必要があります。奇妙な動作は、コードを変更すると実行されるということです->動作します。停止した場合、(まったく同じコードで) 再起動しても機能しません。コードを再度変更すると、->再び機能します。では、それはどのように可能でしょうか。これは私のサイトマップ構成です:

<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0"
            xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd">

  <mvcSiteMapNode title="Werk" controller="Settlement" action="Index">
    <mvcSiteMapNode title="Abteilung" controller="Section" action="Index" preservedRouteParameters="settlementID" inheritedRouteParameters="settlementID">
      <mvcSiteMapNode title="Maschine" controller="Machine" action="Index" preservedRouteParameters="sectionID" inheritedRouteParameters="sectionID"/>
    </mvcSiteMapNode>
  </mvcSiteMapNode>

</mvcSiteMap>

そして、これはコントローラーです(すべてまったく同じように見えます):

public class SectionController : ControllerBase
{
    //
    // GET: /Section/

    [SiteMapPreserveRouteData]
    public ActionResult Index(int settlementID)
    {
        using (var e = new ClapEntities())
        {
            return View(e.Sections.Where(x => x.SettlementID == settlementID).ToList());
        }
    }
}

アプリケーションを再起動しない限り、これは機能するコードです。アプリケーションを再起動しても機能しません。しかし、[SiteMapPreserveRouteData]-Attribute などにコメントすると、もう一度機能します。したがって、アプリケーションを再起動すると、もう機能しません->属性のコメントを解除すると、再起動するまで再び機能します。

では、それはどのように可能ですか?

編集:コードの変更とは関係ありません。Visual Studio メニューで再構築を選択すると機能します。そうしないと、2回は機能しません。

4

2 に答える 2

4

私はこのようなものに出くわしました。私は2つのことをしなければなりませんでした:

  1. ItemDetails子ノードの属性に、親ノードItemsettlementIDのルートパラメータを指定します。ドキュメントの inheritedRouteParameters によると、十分ではありません:preservedRouteParameters

    <mvcSiteMapNode title="Maschine" controller="Machine" action="Index" preservedRouteParameters="settlementID,sectionID"/>
    
  2. すべての preserveRouteParameters がアクション メソッドに存在することを確認してください。ItemsDetailsアクション メソッドがどのように見えるかはわかりませんが、次のようにする必要があります。

    public ActionResult Index(int settlementID, int sectionID)
    {
        //....
    }
    

お役に立てれば...

于 2014-01-14T17:14:32.637 に答える
1

あなたがどの例に従っているかはわかりませんが、この構成にはいくつかの問題があります。

  1. inheritedRouteParameters は、親ノード (mvcSiteMapNode) からパラメーターを継承するためのものです。あなたの例は、決済IDがSettlementControllerではなくSectionControllerの一部であるため、継承する必要がないことを示しています。
  2. preserveRouteParameters と SiteMapPreserveRouteDataAttribute の両方を使用しています。これらは同時に使用するためのものではありません。

また、公式リリース以降、いくつかのノード マッチングのバグ修正が行われているため、最新バージョン (現在は 4.0.6) を使用していることを確認してください。

これらを修正しても問題が解決しない場合は、動作を再現する小さなデモ プロジェクトを作成し、GitHub に投稿するか、圧縮してダウンロードできるようにしてから、新しい問題を開いてデモの場所を投稿してください。見ることができます。

アップデート

あなたの質問を読み直したところ、データベースから商品を表示しようとしていることがわかりました。データベース データのリストまたはテーブルに基づくナビゲーションがある場合、preservedRouteParameters の使用は、SiteMapPath (ブレッドクラム) HTML ヘルパーにのみ役立ちます。これは、現在の HTTP 要求からパラメーターの値をコピーすることにより、すべての ID を強制的に単一のノードに一致させるために使用されます。

ただし、各製品のサイトマップに実際のノードが追加されていない限り、Menu や SiteMap などの他の HTML ヘルパーでそれらを表示することはできず、さらに重要なことに、それらは/sitemaps.xml検索エンジンのエンドポイントに表示されません。

製品を検索エンジンにインデックスする必要があると思われるので、代わりに動的ノード プロバイダーを使用してデータベースからサイトマップにノードをロードすることをお勧めします。これにより、それらすべてが共有キャッシュに保存されるため、非常に効率的で、リクエスト間で「忘れられる」ことはありません。を使用して各製品の ID を設定しnode.RouteValues.Add("id", product.id)て、一致させるための一意の ID があることを確認してください。

于 2013-08-11T18:04:51.310 に答える