【问题标题】:What the best way to handle long query strings in MVC?在 MVC 中处理长查询字符串的最佳方法是什么?
【发布时间】:2012-05-31 07:25:59
【问题描述】:

我正在开发一个应用程序,它可能有很长的查询字符串来维护状态。

我不确定在操作方法中处理这些长查询字符串的最佳方法是什么,因为我最终会得到一个很长的参数列表。

最好直接从请求对象访问查询字符串参数,还是我应该继续创建一个参数列表很长的操作方法?

即需要传入一个配置参数来自定义页面。所以我们可能有这样的查询字符串:?rid=123&bid=456&cid=789&did=aaa&bg=333&f=999&.....

        public ActionResult AvailableTimes(int rid, int bid, int cid, string did, string bg, string f......)
        {
          // Do stuff
        }

public ActionResult AvailableTimes()
        {
          var query = Request.Query;
          // Do stuff
        }

提前致谢。

【问题讨论】:

  • 最好的选择可能是将查询字符串数据移动到其他地方,例如 Session 或 Profile。
  • 举个例子说明你可能会遇到什么......
  • @edmastermind29 用示例更新了帖子
  • @jrummell 我们真的很想避免使用会话并且不需要用户登录来使用该站点
  • 您可以在没有登录用户的情况下访问 Session。

标签: c# asp.net-mvc asp.net-mvc-3 c#-4.0


【解决方案1】:

创建一个包含查询字符串所有参数的类。然后在您的操作结果中,使用对象而不是所有参数。

public ActionResult AvailableTimes(TimeItem time)
        {
          // Do stuff with time
        }
public Class TimeItem
{
    int rid { get; set; }
    int bid { get; set; }
    int cid { get; set; }
    string did { get; set; }
    string bg { get; set; }
} 

【讨论】:

  • 这回答了你的问题吗?
  • 除非您使用 FormMethod.Post,否则这仍会导致查询字符串过长。其实会更长,因为变量会是TimeItem.rid、TimeItem.bid、TimeItem.cid等。
  • @JoeBrockhaus 不,他们不会再出现了。如果 TimeItem 是某个其他对象的属性,那么可以,但是 MVC 足够聪明,可以映射到“rid”和所有其他对象的短名称。我同意这是处理具有大量输入的 Action 的更好方法。
  • @Kleinux 我可能应该更清楚:如果 TimeItem 是模型类型,那么你会得到短名称,但如果它是模型的子项(例如 MyDisplayModel.FilterModel),它将是长名称。我刚刚遇到了这个问题,但是我没有使用 GET 作为表单,而是使用了 Post-Redirect-Get 模式:使用密钥将发布的模型临时缓存在 TempData 中(也可以存储在 Session 或数据库中),然后重定向到获取友好的 URL(在持久化的情况下仅包含缓存实例的 ID)。
  • @JoeBrockhaus 如果表单基于视图模型的子项,则 post 方法参数对象将是该子对象。 EG:MyDisplayPost(FilterModel form) { //do stuff with form var model = new MyDisplayModel(); model.FilterModel = form; //do redirect with model } 这将接受简短命名的表单输入,并仍将正确的模型返回到视图。现在如果表单基于 MyDisplayModel,并在 FilterModel 中返​​回值,那么是的,名称会更长。
猜你喜欢
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多