1

元気?MvcSiteMapプロバイダを作成するのが難しいカスタムSEO URLを使用する

MvcSiteMapプロバイダのBreadcrumbで正しく動作するSEOに優しいURLルートを設定しようとすると、いくつかの問題が発生します。 明らかにシンプルに見えますが、私はSEO関連のものとこのコンポーネントと一緒にASP.NET MVCの経験が不足しているため失われています。

勉強のため、私はMVC SiteMap Providerパッケージを追加した簡単なMVC WebSiteを作成しました。私が達成しようとしているものを

Here's:URL http://localhost:1234/product/the-product-name/1234を考えると

、私はこのようになりますパンくずリスト表示したい:

ホーム>>製品情報>>製品名

URLにするためには、この方法を生成することが、私は次のルートを作成しました:私は、次のノードSTRUを作成し、Mvc.sitemapファイルで

routes.MapRoute(
    name: "SEO_Product", 
    url: "product/{id}/{title}", 
    defaults: new { controller = "Product", action = "Details" } 
); 

をcture:私は上記のSEO_Productルートをコメントアウトするとき

[SiteMapTitle("Title")] 
public ActionResult Details(int id) 
{ 
    var productSearchResult = productRepository.List(pr => pr.Id == id); 
    var product = default(Product); 

    if (productSearchResult.Item != null) 
     product = productSearchResult.Item.FirstOrDefault(); 
    else 
     RedirectToAction("Index"); 

    return View(product); 
} 

ブレッドクラムが正常にレンダリング:

<mvcSiteMapNode title="Home" controller="Home" action="Index"> 
    <mvcSiteMapNode title="Products" controller="Product" action="Index"> 
     <mvcSiteMapNode title="Details" controller="Product" action="Details" preservedRouteParameters="id" /> 
    </mvcSiteMapNode> 
</mvcSiteMapNode> 

また、コントローラ名はProductController、要求を受けたアクションメソッドは次のようです。ただし、このページに到達するために生成されたリンクは、このようなURLです:

http://localhost:50888/Product/Details/1?title=the-product-name(望ましくない)

と私は前述のルートのコメントを解除してアプリを実行すると、ブレッドクラムは、単純にレンダリングされません!

@Html.ActionLink(product.Title, "Details", new { title = product.UrlFriendlyTitle, id = product.Id },null) 

私もマールテンBalliauwのにある指示に従ってくださいする試みでMvc.sitemapへの調整とともにDynamicNodeProviderの実装を作成しようとしました:

は、私はこのように、このページへのリンクを実装しましたSiteMapProvider GitHub、しかし私はさらに失われ、私の心を吹き飛ばしている黄色の死のスクリーンをたくさん受け取りました。それがこの問題のためのそのような特徴を作り出すのであれば、私は本当に分かりません。

あなたは私がどの方向に向かうべきかを私が見せてくれることを願っています。本当にありがとうございます。

クリスティアーノ・M・ディアス

答えて

1

あなたのノードを構成するとき、あなたはすべてのルート値を考慮しなければなりません。 idを設定しても、titleの設定は行っていません。

つまり、titleMvcSiteMapProviderの予約キーです。したがって、別の名前(productTitleなど)をルートキーとして選択する必要があります。

routes.MapRoute(
    name: "SEO_Product", 
    url: "product/{id}/{productTitle}", 
    defaults: new { controller = "Product", action = "Details" } 
); 

次に、ノード構成のproductTitleパラメータを考慮してください。これにより、productTitleのルート値が渡されたときに一致することが保証されます。

<mvcSiteMapNode title="Home" controller="Home" action="Index"> 
    <mvcSiteMapNode title="Products" controller="Product" action="Index"> 
     <mvcSiteMapNode title="Details" controller="Product" action="Details" preservedRouteParameters="id,productTitle" /> 
    </mvcSiteMapNode> 
</mvcSiteMapNode> 

また、リンクにはproductTitleも使用する必要があります。

@Html.ActionLink(product.Title, "Details", new { productTitle = product.UrlFriendlyTitle, id = product.Id },null) 

注:あなたがあなたの質問を持っているURLを取得するには、あなたがproduct/{productTitle}/{id}へのルートを変更する必要があります。

関連する問題