【问题标题】:Persist querystring across requests in MVC 3在 MVC 3 中跨请求持久化查询字符串
【发布时间】:2011-08-28 11:58:54
【问题描述】:

我有一个页面,其中包含一个带有 ActionLink 的客户端列表,允许用户显示(或隐藏)“非活动”客户端。 showInactive=True 附加到 url 作为控制器的查询字符串。显示“非活动”客户端后,我编辑其中一个,但是当我保存任何更改或返回列表时,查询字符串消失了。在这些请求中保留查询字符串的最佳方法是什么?我已经尝试过 TempData 字典,但显然我试图将它用于它不适合处理的东西。

【问题讨论】:

  • 如果您向我们展示您的控制器代码,可能会更容易回答这个问题。
  • 恕我直言,我描述的哪一部分你不明白?如果您创建一个新的 MVC 项目,这是默认行为。

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 razor


【解决方案1】:

实现此目的的一种简单方法是在您的操作中添加returnUrl 参数,如下所示:

[HttpPost]
public ActionResult Edit(int id, ClientEditModel model, string returnUrl)
{
    if (!ModelState.IsValid) return View();
    try
    {
        // do something
        return Redirect(returnUrl);
    }
    catch
    {
        return View();
    }
}

然后在您看来,您可以这样称呼您的操作:

@Html.ActionLink("Edit", "Edit", new { id = Model.Id, returnUrl = Request.RawUrl })

在此设置中,当用户完成编辑后,她将被带回原来的位置,不仅保留showInactive,还保留列表中可能包含的任何其他参数,例如页码、搜索条件、排序顺序等。

【讨论】:

    【解决方案2】:

    将查询字符串参数传递到您的编辑页面并将值添加为隐藏的表单字段参数。如果不存在,则默认为 false。这样,当您执行编辑帖子并进行处理时,您可以将值从绑定的模型/FormCollection/等中提取出来,并根据它的值使用适当的查询字符串参数值进行重定向。

    return this.RedirectToAction("ListClients", new { showInactive = *INSERT THE VALUE* });
    

    翻译成

    /CurrentController/ListClients?showInactive=*value*
    

    【讨论】:

    • 感谢 Khepri - 绕过隐藏的表单字段似乎有点 hackish。我希望可能有一个更清洁的解决方案。
    • 据我所知,没有。我可以理解使用 Session 来持久化它以避免传递值、将其提供给表单并在帖子中读取它的开销,但就个人而言,我只是传递值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多