将?param =附加到mvc路由

时间:2011-08-09 11:40:56

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

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

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

将参数设置为更常规的有什么优点?查询字符串参数,而不是/ param / values /?

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

2 个答案:

答案 0 :(得分:4)

当您有多个可选参数并且不希望包含非指定参数的默认值只是为了满足路径时,查询字符串参数很有用。

您不需要做任何特别的事情就可以在渲染的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的东西,所以它在路由。

任何提供的路线值在路线中具有相应的参数(在这种情况下为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();
    }
}

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

答案 1 :(得分:1)

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

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

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

在此示例中,页面的值为9802,sort为“newest”,pagesize为15。