【问题标题】:Appending ?param= to mvc routes附加 ?param= 到 mvc 路由
【发布时间】:2011-08-09 11:40:55
【问题描述】:

一些 MVC 站点将查询字符串参数附加到路由 Url(我注意到 StackOverflow 确实如此),例如:

https://stackoverflow.com/questions/tagged/java?page=9802&sort=newest&pagesize=15

将参数作为更传统的 ?querystring 参数而不是 /param/values/ 有什么优势?

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

【问题讨论】:

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


    【解决方案1】:

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

    而且您无需执行任何特殊操作即可将这些参数包含在呈现的 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();
        }
    }
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 值得一提的是,我发现在某些情况下,ValueType 参数需要可以为空,以适应未提供它们的情况(即输入 Url 为“干净”),因此允许使用默认值在 null 时应用,而不是处理 0 值。
      • 感谢您的信息。这一切都是有道理的,我只是想知道您将如何生成您的一条路线“并”将尾随 ? 参数附加到路线的末尾?有没有一种辅助方法可以解决这个问题?
      • @Marc - 您正在寻找Url.Action,可以在此处找到一种用法示例:stackoverflow.com/questions/5818065/…
      猜你喜欢
      • 2011-11-06
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多