2017-02-26 7 views
1

ASP.Net MVCで書かれたオンラインストアを想像してみてください。ここには製品と製品の詳細を表示するコントローラがあります。 www.onlineshop.com/Products/Details?id=1234:次のコードMVCコア:詳細情報をURLに表示するためのルーティング

public class ProductsController : Controller { 

    public IActionResult Index(){ 
     return View(ProductList); 
    } 
    public IActionResult Details(String id){ 
     return View(FindProduct(id)); 
    } 
} 

特定の製品を検索するとき、Webブラウザのアドレスバーに表示されたURLは、これに似たものです。

私はSEOを間柱されていると私はより詳細なものにURLを再ルーティングあれば、それは良いアイデアだろうと考えているような:これは達成することができる方法

www.onlineshop.com/Products/Sony/Gaming/PlayStation/PS4Model12345

ASP.Net MVC(コア)? (私が提供したコントローラの例を参照)

+0

たぶん、いくつかのチュートリアルを読んで行く、これは非常に広い質問です。 – DavidG

+0

@DavidG:そうではありません.Davidのみのルーティングに限られています。ルーティングasp.netコアに限定されています。 – Arrrr

+0

いいえ、MVCルーティングです。エンティティにスラッグを追加すると、ロジックのパイプライン全体に影響します。 – DavidG

答えて

1

この質問に対する答えは、実際には非常に簡単です。なぜ私は他のユーザーがかなり長い解決策を推奨したのか分かりませんが、私の意見ではDetails APIにRoute属性を追加することで実行できます。 Viewの中に商品のリストを表示する必要がある場合は、Product Idと表示されているのは普通ではなく、通常はIEnumberable<Product>Indexビューに渡されます。したがって、次のように行うことができます。

[Route("Products/Details/{Manufacturer=unnamed}/{Category=unnamed}/{ActualProduct=unnamed}/{Model=unnamed}/{URLTrail=unnamed}")] 
public IActionResult Details(GUID id) { 
    return View(FindProduct(id)); 
} 

出力例:www.MyOnlineShop.com/Products/Details/Microsoft/Surface/SurfacePro/xxxx-xxxx-....

現在、これらのURLパラメータの一部が欠落している場合、それは本当に重要ではありませんが、ユーザーは、彼らのようにURLをレンダリングするためのオプションを持つことができますが〜のように!

更新:それは合理的なリンクを作成するよう

ビューの内側にURLを構築するには、よりSEOフレンドリーです!

より良い例が、stackoverflowの場合には、この質問のためのURLが

http://stackoverflow.com/questions/42472547/mvc-core-routing-for-displaying-detailed-information-in-the-url

である。この例では、実際の質問IDが42472547で、Googleが検索できるように末尾の部分は、SEOのためです質問。

[Route("Questions/{id}/{SEOHint}"] 

をして{id}部分は問題ではない{SEOHint}一部を検索するために使用されます。この例では、以下のルートが適用されます。私は、この機能を実現するためにカスタマイズすることができ、次の属性を書かれている

ソリューション更新

public abstract class URLOptimizerAttributeBase : Attribute, IRouteTemplateProvider, IActionFilter 
{ 
    public String Template { get; private set; } 
    public int? Order { get; set; } 
    public string Name { get; set; } 
    public URLOptimizerAttributeBase(String Template) { 
     this.Template = Template; 
    } 
    public abstract Boolean Validate(RouteData routeData); 
    public abstract RedirectToRouteResult Redirect(RouteValueDictionary routeValueDictionary); 
    public abstract void OnActionExecuted(ActionExecutedContext context); 
    public virtual void OnActionExecuting(ActionExecutingContext context) 
    { 
     if (!Validate(context.RouteData)) 
     { 
      context.Result = Redirect(context.RouteData.Values); 
     }  
    } 
} 

次に、この属性の実装例を示します。次のように

public class URLOptimization : URLOptimizerAttributeBase 
{ 
    private String SEOHint; 
    public URLOptimization(string Template) : base(Template) 
    { 
    } 

    public object DbContext { get; private set; } 

    public override void OnActionExecuted(ActionExecutedContext context) 
    { 
    } 
    public override bool Validate(RouteData routeData) 
    { 
     return routeData.Values["SEOHint"].Equals(SEOHint); 
    } 
    public override RedirectToRouteResult Redirect(RouteValueDictionary routeValueDictionary) 
    { 
     routeValueDictionary["SEOHind"] = SEOHint; 
     return new RedirectToRouteResult(routeValueDictionary); 
    } 

    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     var id = context.RouteData.Values["Id"]; 
     DbContext db = (DbContext)context.HttpContext.RequestServices.GetService(typeof(DbContext)); 
     var product = db.Find<Products>(id); 
     if (product != null) 
     { 
      SEOHint = product.SEOURL; 
      ((Controller)context.Controller).ViewBag.Data = product; 
      base.OnActionExecuting(context); 
     } 
     else { 
      context.Result = new RedirectResult("Error Page"); 
     } 
    } 
} 

そして、この属性を使用する例は次のようになります。

[URLOptimization("Products/Details/{Id}/{SEOHint=unnamed}")] 
public IActionResult Details(){ 
    return View(ViewBag.Data); 
} 
+0

しかし、どのように我々は情報を取得する:メーカー、カテゴリー、製品名コントローラ内に? – Alexan

+0

@Alex:製品のリストを表示するには、製品がリストされているビューにIEnumerable のようなものを渡します。詳細を表示するには、モデルが既にビューに入っているので、URLを作成してIDで検索することができます。 – Transcendent

+0

ただし、これらのパラメータは詳細署名に含める必要がありますか? – Alexan

関連する問題