将?param =附加到mvc路由

Mar*_*arc 7 asp.net-mvc routing asp.net-mvc-routing

一些MVC站点在路由Url上附加了查询字符串参数(我注意到StackOverflow会这样做),例如:

/sf/ask/tagged/java/?page = 9802&sort = newest&pagesize = 15

将参数设置为更常规的?querystring params,而不是/ param/values /?有什么好处?

此外,这些参数如何附加到已设置的路线上?我熟悉使用诸如"users/details/{id}"之类的参数来设置mvc路由,但是不知道如何配置使用1或更多的路由?params如上面的示例url?

Lob*_*ity 5

当您有多个可选参数并且不想仅仅为了满足路径而为未指定的参数包括默认值时,查询字符串参数将非常有用。

而且,您无需执行任何特殊操作即可在呈现的URL中包含这些参数。

以以下路线为例:

routes.MapRoute
(
    "QuestionsTagged",
    "questions/tagged/{tag}",
    new { controller = "Questions", action = "Tagged" }
);
Run Code Online (Sandbox Code Playgroud)

如果使用以下方法渲染到该路线的链接:

Url.RouteUrl
(
    "QuestionsTagged",
    new
    {
        tag = "java",
        page = 9802,
        sort = "newest",
        pagesize = 15
    }
 )
Run Code Online (Sandbox Code Playgroud)

...然后,路由引擎足够聪明,可以看到该路由包含一个名为的参数tag,并且所传递的路由值对象也具有一个名为的名称,tag因此它将在路由中使用该值。

任何提供路由值具有路由相应的参数(pagesortpagesize在这种情况下)获得上涨了作为查询字符串参数。因此,Url.RouteUrl上面的调用将返回/questions/tagged/java?page=9802&sort=newest&pagesize=15

您的操作方法可以在其签名中显式列出这些参数(提高可读性和可维护性),也可以通过访问它们Request.QueryString

public class QuestionsController : Controller
{
    // I can explicitly list the parameters in my signature and let routing do
    // its magic, like this...
    public ViewResult Tagged(string tag, int? page, int? pagesize)
    {
        // ...or I can grab parameters like this:
        string sort = Request.QueryString["sort"];

        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,操作方法的参数不必与路径中指定的参数匹配。(在路由中,我仅指定tag,但操作方法的签名列表tagpagepagesize。)但是,操作方法的任何参数(也不是路由的参数)必须是引用或可为null的类型。