2017-04-27 69 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