この質問に対する答えは、実際には非常に簡単です。なぜ私は他のユーザーがかなり長い解決策を推奨したのか分かりませんが、私の意見では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);
}
たぶん、いくつかのチュートリアルを読んで行く、これは非常に広い質問です。 – DavidG
@DavidG:そうではありません.Davidのみのルーティングに限られています。ルーティングasp.netコアに限定されています。 – Arrrr
いいえ、MVCルーティングです。エンティティにスラッグを追加すると、ロジックのパイプライン全体に影響します。 – DavidG