4

我想重寫以下網址 -網址在mvc4重寫剃刀引擎

http://localhost:99/Product/CategoryLevel?CategoryId=65&ProductName=Vitamins

http://localhost:99/Product/Vitamins

(或)

http://localhost:99/Product/CategoryLevel/Vitamins

(或)

http://localhost:99/Vitamins

(或)如何刪除(或)隱藏URL中的查詢字符串(即展示給用戶)?

我試過使用url重寫模塊(iis)和asp.net路由和在互聯網上搜索解決方案,但我沒有找到正確的解決方案,請提出任何解決方案。

+0

路由配置是「routes.MapRoute( 名稱: 「默認」, 網址:「{控制器}/{行動}/{id}「, 默認值:new {controller =」Home「,action =」Index「,id = UrlParameter.Optional} ); routes.MapRoute( name:「[clv]」, url:「{controller}/{action}/{id}」, 默認值:new {controller =「Product」,action =「CategoryLevel」,id = UrlParameter。可選} );' – user3166404

回答

-2

你需要有編輯(以下默認)您AppData > RouteConfig.cs

添加代碼的下一行

 routes.MapRoute(
      name: "[Choose a name]", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Product", action = "CategoryLevel", id = UrlParameter.Optional } 
     ); 

而且你的控制器動作應該是以下

public ActionResult CategoryLevel(string ID) 
{ 
} 
+0

我使用了這段代碼,但url仍然是相同的routes.MapRoute( name:「Default」, url:「{controller}/{action}/{id}」, 默認值:new {controller =「Home」, action =「Index」,id = UrlParameter.Optional} ); routes.MapRoute( name:「[clv]」, url:「{controller}/{action}/{id}」, 默認值:new {controller =「Product」,action =「CategoryLevel」,id = UrlParameter.Optional} ); @ Devcon 2 – user3166404

+0

您是否也改變了控制器中的動作? –

+0

是的,公共ActionResult CategoryLevel(字符串ID){-----------------} @ Devcon 2 – user3166404

8

您必須映射此路線之前所有其他路線映射(路線按順序評估):

routes.MapRoute(
    name: "Product", // any name meaningful for you is right 
    url: "Product/{productName}", 
    defaults: new { controller = "Product", action = "CategoryLevel" } 
); 

這條路線將捕獲所有看起來像這樣的URL:

http://myserver/Product/X 

不管X是。如果你這樣做,你的動作應該是這樣的:

public ActionResult CategoryLevel(string productName) 

注:該參數名稱必須與路由映射段匹配:productName

所以,每當用戶類型:

http://myserver/Product/Vitamins 

將執行動作CategoryLevel,它將收到productName參數,其值爲"Vitamins"

的問題是,如果你有你期望被調用這樣

http://myserver/Product/List 

動作List路線將映射,並會調用CategoryLevel動作與productName = "List"

爲了避免這個你可以用這條路線:

routes.MapRoute(
    name: "Product", // any name meaningful for you is right 
    url: "ViewProduct/{productName}", 
    defaults: new { controller = "Product", action = "CategoryLevel" } 
); 

哪一個會和別人不一樣,什麼都會w ork罰款。此方法特定的URL將如下所示:

http://myserver/ViewProduct/TheProductName 

和其他路徑將按預期工作。順便說一句:你應該有一個產品的具體行動,例如View,而不是CategoryLevel。因此,路線和動作是這樣的:

routes.MapRoute(
     name: "ViewProduct", // any name meaningful for you is right 
     url: "ViewProduct/{productName}", 
     defaults: new { controller = "Product", action = "View" } 
    ); 

動作,產品控制器內部:

public ActionResult View(string productName) 

的路由映射用戶鍵入的URL對應的動作中使用了兩種,並使用一些MVC幫助程序生成URL,如Html.ActionLinkUrl.Action。所以,如果你做這樣的事情:

Url.Action('View', 'Product', new {productName = "Vitamins"}) 

你會得到預期的,短網址:

http://myserver/ViewProduct/Vitamins 

即路線圖是雙向映射,可以將URL映射到動作,反之亦然。

+0

它的工作,但仍然亞姆得到這樣的http:// localhost:99/Product /維生素?CategoryId = 65,但我不想顯示?CategoryId = 65,我無法進入下一級@ JotaBe – user3166404

+0

你是如何得到錯誤的URL?如果你不需要這個參數,不要使用它,它會停止出現在url中。 – JotaBe

+0

@JotaBe這很好。但我不喜歡的是,首先如果有人打電話給原來的電話'/ Product/CategoryLevel?CategoryId = 65&ProductName = Vitamins',那麼這種方法就行不通了。此外,如果您在該控制器上執行了其他一些操作,而不是您建議的「列表」,則最終會爲每個操作員編寫路由。 –