1

ブレッドクラムで同じページへの 3 つのパスをナビゲートしたいと考えています。サイトマップは一番下にあります。

<mvcSiteMapNode title="New" controller="Actions" action="NewActions" area="Promotion">
  <mvcSiteMapNode title="Action" controller="Actions" action="ActionTabDetails" area="Promotion"/>
</mvcSiteMapNode>
<mvcSiteMapNode title="Continues" controller="Actions" action="ContinuesActions" area="Promotion">
  <mvcSiteMapNode title="Action" controller="Actions" action="ActionTabDetails" area="Promotion" actionStatus="1"/>
</mvcSiteMapNode>
<mvcSiteMapNode title="Finished" controller="Actions" action="FinishedActions" area="Promotion">
  <mvcSiteMapNode title="Action" controller="Actions" action="ActionTabDetails" area="Promotion" actionStatus="2"/>
</mvcSiteMapNode>

属性「type」と「key」を試してみましたが、役に立ちませんでした。アクション ActionDetails を開くたびに、ブレッドクラムは root > Finished > Action のように見えます

パスの選択は、モデルのステータスによってコントローラで決定されます。独自の DynamicNodeProvider を作成する必要がありますが、コントローラーからプロバイダーにパラメーターを渡す方法がわかりません。下部のようにアクション本体でモデルを条件付けているため、アクション注釈を使用できませんでした:

public ActionResult ActionTabDetails(Guid actionTabGuid)
{
    ActionTab model = actionTabRepo.Get(actionTabGuid, "ActionGroup");

    if (model.Status == ActionStatus.New)
    {
          //Parameter with I want to pass to the DynamicNodeProvider or select current node
    }
    //another conditions
    return View("ActionTab/ActionTabDetails", model);
}

私は試した:

SiteMap.CurrentNode = SiteMap.Provider.FindSiteMapNodeFromKey("new");

しかし、コントローラーではゲッターのみです。

私は助けてくれてとても感謝しています。

更新しました:

オプションのパラメーターでアクションを作成しました:

public ActionResult ActionTabDetails(Guid actionTabGuid, int actionStatus=0)

しかし、次のようなすべてのURL

  • /プロモーション/アクション/アクション?actionTabGuid=822ed729-8edd-4301-970a-867d2b4f9246
  • /プロモーション/アクション/アクション?actionTabGuid=822ed729-8edd-4301-970a-867d2b4f9246&actionStatus=1
  • /プロモーション/アクション/アクション?actionTabGuid=822ed729-8edd-4301-970a-867d2b4f9246&actionStatus=2

パラメータなしで最初のノードに直接送信します。obvers パラメータを実際に使用してみましたが、効果は同じです。私は助けに感謝します。

4

1 に答える 1

0

これを機能させるための鍵は、ルート値のすべてのセットが SiteMap 内で一意でなければならないことを理解することです。つまり、1 つを除くすべてのルートに別のパラメーターを追加する必要があり、パラメーター名またはその値はすべてのノードで異なる必要があります。

<mvcSiteMapNode title="New" controller="Actions" action="NewActions" area="Promotion">
  <mvcSiteMapNode title="Action" controller="Actions" action="ActionTabDetails" area="Promotion"/>
</mvcSiteMapNode>
<mvcSiteMapNode title="Continues" controller="Actions" action="ContinuesActions" area="Promotion">
  <mvcSiteMapNode title="Action" controller="Actions" action="ActionTabDetails" area="Promotion" someParameter="1"/>
</mvcSiteMapNode>
<mvcSiteMapNode title="Finished" controller="Actions" action="FinishedActions" area="Promotion">
  <mvcSiteMapNode title="Action" controller="Actions" action="ActionTabDetails" area="Promotion" someParameter="2"/>
</mvcSiteMapNode>

ルート値 (または url 属性に設定された明示的な URL) の組み合わせによって、ノードが現在のノードであると識別され、最初に一致したものが常に優先されます。ただし、データを追加すると、各ノードは完全に一意になります。

デフォルト ルートを使用している場合、URL は次のようになります。

  • /プロモーション/アクション/アクション
  • /プロモーション/アクション/アクション?someParameter=1
  • /プロモーション/アクション/アクション?someParameter=2

必要に応じて、 RouteBase を継承するか、カスタム パラメーターをルートに追加して、URL をよりユーザーフレンドリーにすることにより、MVC ルートをカスタマイズすることもできます。

URL を好みの方法 (つまり、UNIQUE URL) に設定したら、canonical タグ HTML ヘルパーを使用して、「メイン」URL のみが検索エンジンによってインデックス付けされ、他の URL が無視されるようにすることができます。canonicalKey または canonicalUrl 属性を「メイン」ノードの属性に設定するだけです。

<mvcSiteMapNode title="New" controller="Actions" action="NewActions" area="Promotion">
  <mvcSiteMapNode title="Action" controller="Actions" action="ActionTabDetails" area="Promotion" key="TheMainAction"/>
</mvcSiteMapNode>
<mvcSiteMapNode title="Continues" controller="Actions" action="ContinuesActions" area="Promotion">
  <mvcSiteMapNode title="Action" controller="Actions" action="ActionTabDetails" area="Promotion" someParameter="1" canonicalKey="TheMainAction"/>
</mvcSiteMapNode>
<mvcSiteMapNode title="Finished" controller="Actions" action="FinishedActions" area="Promotion">
  <mvcSiteMapNode title="Action" controller="Actions" action="ActionTabDetails" area="Promotion" someParameter="2" canonicalKey="TheMainAction"/>
</mvcSiteMapNode>

次に@Html.MvcSiteMap().CanonicalTag()、レイアウト ページの HEAD セクションに HTML ヘルパーを追加するだけで、標準 URL が代替ページ (ただし、「メイン」ページではありません) に自動的に作成されます。

ダウンロード可能な例については、この投稿を参照してください。また、この投稿では、ノード マッチング機能のしくみについて詳しく説明しています。

MVC ルーティング

URL の構築方法を決定するのはルートであることに注意してください。RouteConfig.cs ファイルを見てください。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

ご覧のとおり、デフォルト ルートはパラメータとして「id」のみを使用します。コントローラー、アクション、ID 以外で追加するものはすべて、クエリ文字列の一部になります。アプリケーションの必要に応じて、追加のルート、パラメーター、および制約を追加できます (より具体的なルートはデフォルト ルートの前に属し、通常はデフォルト ルートをそのままにしておく必要があります)。ルーティングの詳細についてはMSDNを参照するか、Google の「mvc ルーティング」を参照してください。すばらしいチュートリアルがたくさんあります。

ヒント: AttributeRoutingを使用すると、アクション メソッドを複数の属性で装飾することにより、アクション メソッドへの複数のルートを簡単に提供できRouteます。

[Route("new-actions/action-tab-details/{actionTabGuid}")]
[Route("continues-actions/action-tab-details/{actionTabGuid}")]
[Route("finished-actions/action-tab-details/{actionTabGuid}")]
public ActionResult ActionTabDetails(Guid actionTabGuid)
{
    ActionTab model = actionTabRepo.Get(actionTabGuid, "ActionGroup");

    if (model.Status == ActionStatus.New)
    {
          //Parameter with I want to pass to the DynamicNodeProvider or select current node
    }
    //another conditions
    return View("ActionTab/ActionTabDetails", model);
}

ルーティングを台無しにしたくない場合は、デフォルト ルートを使用し、「id」を Guid 値として使用することをお勧めします (ほとんどのアクションには 1 つしかないため)。"actionStatus" がアプリケーションにとって何の意味もなく、ルートで必要な値として指定されていない場合 (デフォルト ルートでは指定されていない場合)、アクション メソッドに「actionStatus」を追加する必要はありません。

MvcSiteMapProvider ルーティング

この反対側には、MvcSiteMapProvider に一致するノードがあります。カスタム ルート値 (パラメーター) を使用する場合は、MvcSiteMapProvider を構成して、カスタム パラメーターを使用していることを認識させる必要があります。これを行うには、考えられるすべての組み合わせを個別のノードとして追加します ( IDynamicNodeProviderを使用)。または ISiteMapNodeProvider) またはすべての値を、preservedRouteParameters を持つ単一のノードと一致させる必要があります。検索エンジンですべてのページをインデックス化することが重要な場合は、値ごとに個別のノードを使用します。ページが主にデータ入力用である場合は、preservedRouteParameters を使用します。通常、preservedRouteParameters を使用する場合は、SiteMapTitleAttribute と可視性プロバイダーも使用して、メニューとブレッドクラム トレイルの外観を調整する必要があります。この投稿から、これらの両方の手法のデモをダウンロードできます。

于 2013-11-14T01:47:00.430 に答える