【问题标题】:Passing multiple values as query string is good or bad practice in MVC在 MVC 中将多个值作为查询字符串传递是好是坏
【发布时间】:2012-02-27 09:59:27
【问题描述】:

在我的页面中,我将多个值传递给控制器​​。

我的网址类似于: http://blah/Search/Page/?type=new&keywords=blahblah&sortType=Date

在 MVC 中将多个值作为查询字符串传递是好的做法吗?或者我们可以通过引入自定义路由来使用斜线分隔 URL?

注意:让我们考虑一下我的查询字符串中的所有值,它们不是安全/敏感数据。

【问题讨论】:

    标签: asp.net-mvc-3 model-view-controller asp.net-mvc-routing


    【解决方案1】:

    稍后选择(路由值中的查询字符串)以防万一,

    1. 如果您关心标头长度。(默认情况下,get 参数是标头的一部分,Web 服务器在 IIS7 中默认接受 1024 字节的标头长度)。
    2. 隐藏代码的逻辑实现。
    3. 网址看起来不错,而且更容易记住。

    否则这两种方法的效果是一样的。

    【讨论】:

      【解决方案2】:

      只要不是敏感数据,我不会认为这是一种不好的做法。这仅取决于您是否要在 global.asax 中编写自定义路由来处理它。自定义路由确保提供更清晰的 url。此外,对于更精明的用户,如果他们了解您网站上的概念,它会更直观。

      所以考虑一下:

      http://baseballcards/topps/1980      // search for baseball cards made by topps in the 1980s
      http://recipes/deserts/pies         // search for a desert recipe that are pies  
      http://code/csharpe/linq             // search for csharp code that has linq examples
      

      在这些示例中,我们几乎可以像阅读句子一样阅读 url,使其更直观,让用户能够即插即用。它几乎像面包屑一样清楚地表示查询,准确地指示上下文将是什么。我个人喜欢这个。但无论哪种方式都是一个好方法。

      使用更多参数进行扩展:

      routes.MapRoute(
                  "SearchRecipes",                                              
                  "Search/Recipes/{category}/{type}",                           
                  new { controller = "Search", action = "Recipes", category = "all" , type = ""}  
       );
      

      一些例子:

      Search/Recipes/Deserts/Pie
      Search/Recipes/Dinner/Beef
      Search/Recipes/Lunch/Salads
      

      【讨论】:

      • 我确实理解上述方法的可读性,但我们还能进一步扩展它吗?就像我在上面演示的情况一样,只有一个参数是不够的......例如,我也想将饮料类型(比如热饮或冷饮)指定为 recipies/deserts/pies
      • 您可以拥有任意数量的参数。您只需要在 global.asax 中的自定义路由中定义它。我正在更新我的答案...
      • 是的,我们可以在 Global.asax 中添加额外的路由,当我们输入 ../Search/Recipes/Deserts/Pie 之类的 URL 时,我们可以重定向到该页面。但是如何通过我们的代码生成那个 URL?当我们尝试在 Url.Action 中添加路由值时,它会以查询字符串的形式出现。 :(
      • 例如 Url.Action( "Recipes" , "Search" , new { type = item.type} ) 会给我的链接看起来像:Search/Recipes?type=Deserts,但我想要生成像 Search/Recipes/Deserts/Pie 这样的 url。请让我知道我们如何才能做到这一点?
      • 你的路线在 global.asax 中是什么样子的。也给我看看你的实际Url.Action
      【解决方案3】:

      IMO 我认为这绝对没问题。我认为当路径表示函数并且查询字符串参数表示过滤器时,实际上最好在 MVC 中使用查询字符串,例如就像在搜索中一样。

      但是,我不会将查询字符串参数用于表示有关检索到的内容的信息的数据。因此,如果返回的年份和月份超过一页,我将在路径中包含文章的年份和月份,但不包含页码。

      【讨论】:

        【解决方案4】:

        我认为在查询字符串中传递搜索参数是您应该采用的方式,特别是如果您的所有参数都是可选的。它还使您能够轻松使用普通的method="get" 表单。

        我认为“安全/个人数据”与此无关,因为查询字符串是 URL 的一部分,就像路径一样。

        【讨论】:

          猜你喜欢
          • 2017-04-16
          • 2014-05-13
          • 2016-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多