一些MVC站点在路由Url上附加了查询字符串参数(我注意到StackOverflow的作用),例如:
?https://stackoverflow.com/questions/tagged/java页= 9802&放大器;排序=最新及放大器;页面大小= 15
将参数设置为更常规的?querystring params,而不是/ param / values /?有什么好处?
此外,这些参数如何附加到已设置的路线上?我熟悉使用诸如“users / details / {id}”之类的参数设置mvc路由但是不知道如何配置使用1个或更多的路由?params如上面的示例url?
解决方法
当您有多个可选参数并且不希望包含非指定参数的默认值只是为了满足路径时,查询字符串参数很有用.
并且您无需执行任何特殊操作即可将这些参数包含在呈现的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(); } }
请注意,action方法的参数不必与路径中指定的参数匹配. (在路由中,我只指定了标记,但是操作方法的签名列表标记,页面和页面大小.)但是,动作方法的任何参数(也不是路径的参数)必须是引用或可空类型.