2011-08-09 48 views
7

一些MVC网站已经查询字符串PARAMS附加到路径网址(其中我注意到StackOverflow上一样),比如:追加PARAM = MVC的路线

https://stackoverflow.com/questions/tagged/java页= 9802 &排序=最新&页面大小= 15

什么是具有参数更常规?查询字符串则params的优点,而不是/ PARAM /值/?

另外,这些参数是如何附加到已经建立的路线?我熟悉使用像“users/details/{id}”等参数来设置mvc路由,但不知道如何配置1个或多个?params使用的路由,如上面的示例url所示?

回答

4

查询字符串参数都是有用的想要包含非指定参数的默认值只是为了满足路径。

而且你不需要做什么特别的包括在呈现的网址这些参数。

看看下面的路线,例如:

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,在这种情况下sortpagesize)获得上涨了作为查询字符串参数相应的参数。所以上面的电话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方法的参数不必与路径中指定的参数相匹配。 (在路由中,我只指定了tag,但操作方法的签名列表为tag,pagepagesize。)但是,不是路由参数的操作方法的任何参数都必须是引用或可为空类型。

1

我通常看到寻呼和滤波的数据作为查询字符串参数,因为它使信息以URI中的用户通过。如果用户更改此数据通常也是无害的,因为它只会过滤您在页面上看到的数据。任何敏感数据通常都会发布,因为它不容易被看到或修改,但我认为要保持URI的清洁并尽可能少地使用quesrystrings。

指定路线时,能够处理quesrystrings你不需要做任何特殊。它们只是传递给您的操作的额外数据。在你的行动中,你需要做一些工作来处理数据。使用上面的查询字符串必须指定查询字符串名称作为参数名称,然后指定您期望的任何数据类型。

public ActionResult Index (int page, string sort, int pagesize) 

在这个例子中,页面将是9802的价值,排序将是“最新”和页面大小将是当你有多个可选参数,并没有15

+0

值得一提的是,我发现在某些情况下,ValueType参数需要为空来满足不提供它们的情况(即输入Url是'clean'),因此允许在空值时应用默认值,而不是处理'0'值。 –

+0

感谢您的信息。这一切都是有道理的,我只是想知道你如何生成你的路线之一'并且'将尾部参数追加到路线的末端?有没有可以适应这种情况的辅助方法? – Marc

+0

@Marc - 您正在寻找'Url.Action',并且可以在这里找到一种使用类型的示例:http://stackoverflow.com/questions/5818065/how-to-pass-request-querystring-to -url行动 – amurra