Asp.net mvc 将?param=附加到mvc路由

Asp.net mvc 将?param=附加到mvc路由,asp.net-mvc,routing,asp.net-mvc-routing,Asp.net Mvc,Routing,Asp.net Mvc Routing,一些MVC站点在路由Url后附加了querystring参数(我注意到StackOverflow有此功能),例如: ?页面=9802&sort=最新&pagesize=15 将参数设置为更常规的参数有什么好处?querystring params,而不是/param/values/ 此外,这些参数是如何附加到已设置的路由的?我熟悉使用“users/details/{id}”等参数设置mvc路由,但不知道如何根据上面的示例url配置路由以使用1个或多个?param?我通常看到分页和筛选数据作为qu

一些MVC站点在路由Url后附加了querystring参数(我注意到StackOverflow有此功能),例如:

?页面=9802&sort=最新&pagesize=15

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


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

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

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

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

在本例中,page的值为9802,sort的值为“最新”,pagesize的值为15。

如果您有多个可选参数,并且不希望仅为了满足路径而包含非指定参数的默认值,则查询字符串参数非常有用

在呈现的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
的对象,因此它在路由中使用该值

在路由中没有相应参数的任何提供的路由值(
页面
排序
页面大小
,在本例中)将作为查询字符串参数附加。因此上面的
Url.RouteUrl
调用将返回
/questions/taged/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();
    }
}

请注意,动作方法的参数不必与路由中指定的参数匹配。(在路由中,我只指定了
标记
,但操作方法的签名列出了
标记
页面
,以及
页面大小
),动作方法的任何参数如果不是路由的参数,则必须是引用或可为null的类型。

另外值得一提的是,我发现在某些情况下,ValueType参数需要为null,以满足未提供参数的情况(即输入Url为“干净”)因此,允许在null时应用默认值,而不是处理
0
值。感谢您提供的信息。这一切都是有道理的,我只是想知道如何生成一条路由并将尾部参数附加到路由的末尾?是否有一个助手方法可以满足此要求?@Marc-您正在查找
Url.Action
,可以在此处找到一种用法的示例: