Asp.net mvc 3 - 按名称获取参数

时间:2011-11-26 05:57:57

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

有一个网址

http://mysite.com/en-us/articles/browse/en-us/12/byCategory

众所周知,其中一个参数名为culture。当然,我可以致电ViewContext.RouteData.Values["culture"]来获取culture,但它并没有说明我en-us参数(第一个或第二个){ {1}}。

我的任务是识别哪个名为culture的参数,用指定的值替换它并返回新的url。怎么做?

1 个答案:

答案 0 :(得分:3)

您不能拥有两个名称相同的段参数

因此,如果您说ViewContext.RouteData.Values["culture"],您将获得与第一个或第二个特定段相关的正确文化值,具体取决于您的路径网址定义像:

{culture}/{controller}/{action}/{lang}/{id}/{filter}

正如您所看到的,只有一个名为culture的段参数。

  

注意:上部路线网址定义可能与您的不同,但它会显示一个可以处理您的请求网址的示例。

获取当前路线的URL定义

但是否则您可以通过以下方式获取当前正在执行的路径URL定义以找到正确的段:

((Route)ViewContext.RouteData.Route).Url

RouteBase转换为Route可能会在99%的情况下有效,因为使用自定义路由类并不常见,但即使自定义类更有可能从Route继承比RouteBase

根据路径定义的复杂性,解析此URL定义可能是一项更具挑战性的任务。但是,您可以或多或少地成功地将任何URL定义与请求URL段匹配。这可能正是你所追求的。

让当前路线替换你

但是,不是解析路由的URL并替换正确的段,您可以让路由本身只为您执行:

((Route)ViewContext.RouteData.Route)
    .GetVirtualPath(
        ViewContext.RequestContext,
        new RouteValueDictionary(new { culture = "en-GB" }))
    .VirtualPath