これを機能させるための鍵は、ルート値のすべてのセットが 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 と可視性プロバイダーも使用して、メニューとブレッドクラム トレイルの外観を調整する必要があります。この投稿から、これらの両方の手法のデモをダウンロードできます。