2017-08-02 1 views
0

Webサイトをasp.netに移植する必要があり、Umbracoを基盤とするCMSとして使用することに決めました。Umbracoとルートレベルの動的URLコンテンツ

問題は、現在のサイトのURL構造を維持する必要があることです。

現在のURLテンプレートには、次の

domain.com/{brand}/{product} 

のように見えるこれは、サイト上の他のすべてのコンテンツでミックス以来のルートを作るのは難しいです。 domain.com/foo/barのようなブランドや製品ではありません。

私はIContentFinderをコードし、それをUmbracoのパイプラインに注入しました。URL構造を確認して、domain.com/{brand}がサイトの既知のブランドと一致するかどうかを判断します。その場合、内部ルートdomain.com/products/を入力し、{brand}/{model}HttpContext Itemsとし、IContentFinderを使用して返します。

これは機能しますが、MVCコントローラが呼び出されていないことを意味します。ですから、私はcshtmlファイルのデータベースからフェッチしています。これはあまり美しくないし、MVCの慣習を破るものです。

URLはdomain.com/{brand}/{product}で、domain.com/products/{brand}/{product}に書き換えてから、パラメーターブランドと製品に基づいてコンテンツを提供するProductsControllerをヒットすることができます。

答えて

1

これを行うにはいくつかの方法があります。

これはコンテンツ設定によって少し異なります。あなたの製品がUmbracoのページとして存在する場合、私はあなたが正しい道にいると思います。コンテンツファインダーで

、その要求のために呼び出されますProductControllerを追加するためにあなたは、あなたがルートのハイジャックを利用することができ、このrequest.PublishedContent = content;

のような要求に見つけたページを設定することを忘れないでください:https://our.umbraco.org/Documentation/Reference/Routing/custom-controllers

実装例:

protected bool TryFindContent(PublishedContentRequest docReq, string docType) 
{ 
    var segments = docReq.Uri.GetAbsolutePathDecoded().Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries); 
    string[] exceptLast = segments.Take(segments.Length - 1).ToArray(); 

    string toMatch = string.Format("/{0}", string.Join("/", exceptLast)); 

    var found = docReq.RoutingContext.UmbracoContext.ContentCache.GetByRoute(toMatch); 
    if (found != null && found.DocumentTypeAlias == docType) 
    { 
     docReq.PublishedContent = found; 
     return true; 
    } 

    return false; 
} 

public class ProductContentFinder : DoctypeContentFinderBase 
{ 
    public override bool TryFindContent(PublishedContentRequest contentRequest) 
    { 
     // The "productPage" here is the alias of your documenttype 
     return TryFindContent(contentRequest, "productPage"); 
    } 
} 

public class ProductPageController : RenderMvcController {} 

例では、文書種別が "productPage" の別名を持ちます。つまり、コントローラーは正確に "ProductPageController"という名前を付け、RenderMvcControllerを継承する必要があります。

実際のページ名が何であるかは関係ありません。

+0

コンテンツツリーにはdomain.com/Porducts/の1ページしかありません。私は外部ソースから製品を入手しています。 IContentFinderでContentCache.GetByRoute( "Products /")ビットを使用してPublishedContentを設定すると、ProductsControllerによってトリガされないように見えます.Productコンテンツアイテムには独自のドキュメントタイプとテンプレートがあります。 私はテンプレートにHtml.RenderAction()を挿入し、それをProductsControllerに向けることで動作させました。しかし、私は非常にきれいだとは思わないし、最初にGetByRoute( "Products /")を呼び出すときにProductsControllerを押すことができません。 – CodeMonkey

+0

@ CodeMonkey [OK]を、私はあなたが探しているものをほとんどどこで行うプロジェクトからいくつかのサンプルコードが含まれています。私の場合は、あなたが提供するドキュメントの種類に一致するまで、URLからセグメントを切り取るでしょう。 次に、あなたは "brand/sku"を "products/brand/sku"にre retritするURL書き換えと組み合わせることができ、上記のコードはあなたを動かすはずです。 – mortenbock

+0

ありがとう、私は家に帰るとこれを試してみます。ProductPageControllerの動作はどのようにこのすべてに適合しますか? UmbracoのコンテンツツリーのProductPageコンテンツアイテムにテンプレートが割り当てられているか、コントローラを使用してビュー(cshtml)を返す必要がありますか? – CodeMonkey

関連する問題