2017-04-27 25 views
0

我在MVC新的,定義爲我的路線遵循:MVC路由:生成多個過濾器參數之間的短跑在地址

routes.MapRoute(
      name: "NewRoute", 
      url: "P/{colorname}-{id}/{statename}-{materialtype}-{HasPrice}", 
     defaults: new 
      { 
       controller = "Products", 
       action = "P", 
       id = UrlParameter.Optional, 
       statename = UrlParameter.Optional, 
       colorname = UrlParameter.Optional, 
       materialtype = UrlParameter.Optional, 
       HasPrice = UrlParameter.Optional 

      } 
     ); 

當用戶搜索在我的網站,我想表現出以下網址:

P /قیمت-نوعمواد-ناماستان/شماره-رنگ

,但得到404錯誤,並出示此URL:/ P/-/-

請幫我... 感謝s ...

回答

0

首先,在這種情況下選擇路由值沒有任何意義。可選參數僅限如果它們是最右邊的參數,然後再加上另一個可選參數或/。你的URL中有破折號,這使得這是不可能的。因此,除去擇聲明路線:

routes.MapRoute(
     name: "NewRoute", 
     url: "P/{colorname}-{id}/{statename}-{materialtype}-{HasPrice}", 
     defaults: new 
     { 
      controller = "Products", 
      action = "P" 
     } 
    ); 

您還必須確保您的route can be matched(即不前,將使其無法到達已註冊路線)。用簡單的英語,這意味着您必須在之前定義上述路線您的默認路線

請注意,因爲沒有任何參數是可選的,所以如果存在任何缺失的路由,則總是會跳過該路由 - 這是可取的行爲,因爲您希望匹配的配置中可能存在額外的路由,一。

現在,要生成所需的URL,需要在生成URL時提供缺少的路由數據。例如,這是你將如何使用上述路線產生在你的問題中的超鏈接的URL:

@Html.ActionLink("My Link", "P", "Products", 
    new { colorname = "رنگ", id = "شماره", statename = "نام استان", 
     materialtype = "نوع مواد", HasPrice = "قیمت" }, null) 

當然,這是假設你已經做了題爲ProductsController有命名它P動作控制器。

+0

感謝您的詳細解釋...但是當我使用這個ActionLink時,它會轉到myDefault路由...我的默認路由在NewRoute後定義..請幫助我... –

+0

看起來您的話也可能有空格在他們之間,這是不允許的一個URL。請參閱[(請)停止在URL中使用不安全的字符](https://perishablepress.com/stop-using-unsafe-characters-in-urls/)以查看URL中允許和不允許使用哪些字符的細目。我建議你使用佔位符字符或標記作爲空間,讓你的應用程序在令牌到達你的控制器之前做一個替換,例如在值提供程序或過濾器中。 – NightOwl888