我正在開發一個 mvc 核心 3.1 應用程式。搜索引擎優化要求是顯示產品名稱與主站點而不是完整的 url。
我的原始網址是
www.abc.com/Fashion/ProductDetail?productId=5088&productName=AliviaBlack&brandId=3
要求是
www.abc.com/alivia-black
我嘗試使用屬性路由進行跟蹤
endpoints.MapControllerRoute(
name: "SpecificRoute",
pattern: "/{productName}",
defaults: new { controller = "Fashion", action = "ProductDetail", id= "{productId}" });
在視圖頁面
<a asp-route-productId="@product.ProductId"
asp-route-productName="@Common.FilterURL(product.ProductName)"
asp-route-brandId="@product.FashionBrand.FashionBrandId" asp-route="SpecificRoute">
結果是
www.abc.com/alivia-black?productId=5223&brandId=4
如何洗掉它后面的問號和引數。
uj5u.com熱心網友回復:
首先,URI 需要具有彈性。您說您當前的要求是擁有這樣的 URI:
www.abc.com/alivia-black
IE:
{host}/{productName}
這是一個非常糟糕的URI 模板,因為:
- 它不會唯一標識產品(因為您可能有多個具有相同名稱的產品)。
- 如果您重命名產品或替換具有相同名稱的產品,它將破壞來自外部網站的現有鏈接。而這種情況發生了很多在任何產品資料庫。
- 因為您將 放在
{productName}URI 結構的“根”中,這意味著除了查看產品之外,處理其他任何事情要困難得多(例如,您將如何擁有一個/contact-us頁面?如果您有一個名為 的產品contact-us怎么辦?)
我強調productId在 URI 中包含被請求物體的不可變鍵(在本例中為您的值)并將其用作主要參考非常重要,因此productName在處理傳入的 HTTP 請求時可以忽略它。這就是 StackOverflow 和 Amazon 的 URI 的作業方式(您可以在 StackOverflow 的問題 ID 之后修剪文本,它仍然可以作業:例如
https://stackoverflow.com/questions/69748993/how-to-show-seo-friendly-url-in-mvc-core-3-1
https://stackoverflow.com/questions/69748993
我強烈建議您在 W3.org 的網站上閱讀這篇關于設計好的 URI 的文章,以及該組主頁上的其他指南。
我建議你使用一個更好的 URI 模板,比如這個:
{host}/products/{productId}/{productName}
這會給你一個這樣的URI:
abc.com/products/5088/alivablack
在 ASP.NET MVC(和 ASP.NET Core)中處理這樣的鏈接很簡單,只需在控制器操作上設定路由模板:
[Route( "/products/{productId:int}/{productName?}" )]
public async Task<IActionResult> ShowProduct( Int32 productId, String? productName = null )
{
// Use `productId` to lookup the product.
// Disregard `productName` unless you want to use it as a fallback to search your database if `productId` doesn't work.
}
至于生成URI,我建議不要使用 TagHelpers(例如<a asp-route-),因為它們不能讓您充分控制 URI 的呈現方式,相反您可以定義一個UrlHelper擴展方法(確保@import將命名空間.cshtml添加到您的頁面中(或將其添加到ViewStart):
public static class MyUrls
{
public static String ShowProduct( this IUrlHelper u, Int32 productId, String productName )
{
const String ACTION_NAME = nameof(ProductsController.ShowProduct);
const String CONTROLLER_NAME = "Products"; // Unfortunately we can't use `nameof` here due to the "Controller" suffix in the type-name.
String url = u.Action( action: ACTION_NAME, controller: CONTROLLER_NAME, values: new { productId = productId, productName = productName } );
return url;
}
}
然后你可以像這樣使用它:
<a href="@Urls.ShowProduct( 5088, "aliviablack" )">View AliviaBlack</a>
您還可以直接ShowProduct接受您的一個Product物件,然后將值傳遞給接受標量的另一個多載(如上定義):
public static String ShowProduct( this IUrlHelper u, Product product )
{
String url = ShowProduct( u, productId: product.ProductId, productName: product.ProductName );
return url;
}
然后你可以像這樣使用它(假設product在范圍內):
<a href="@Urls.ShowProduct( product )">@product.ProductName</a>
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/339676.html
標籤:asp.net-mvc asp.net-mvc-5 asp.net-core-3.1
上一篇:PBIVIZ不承認證書
下一篇:下拉串列中的重復值-MVC
