当您有多个可选参数并且不想为了满足路径而包含非指定参数的默认值时,查询字符串参数很有用。
而且您无需执行任何特殊操作即可将这些参数包含在呈现的 URL 中。
以如下路线为例:
routes.MapRoute
(
"QuestionsTagged",
"questions/tagged/{tag}",
new { controller = "Questions", action = "Tagged" }
);
如果您使用以下方式呈现指向该路由的链接:
Url.RouteUrl
(
"QuestionsTagged",
new
{
tag = "java",
page = 9802,
sort = "newest",
pagesize = 15
}
)
...那么路由引擎足够聪明,可以看到路由包含一个名为 tag 的参数,并且传递的路由值对象也有一个名为 tag 的东西,因此它在路由中使用该值。
不在路由中具有相应参数的任何提供的路由值(在这种情况下为page、sort 和pagesize)都会被添加为查询字符串参数。所以上面的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();
}
}
请注意,动作方法的参数不必与路由中指定的参数匹配。 (在路由中,我只指定了tag,但是action方法的签名列出了tag、page和pagesize。)但是,任何不是路由参数的action方法的参数都必须是引用或可为空的类型。