如何让MVC POST返回上一页?

时间:2011-11-02 17:05:42

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

我有以下操作,从带有记录列表的屏幕调用。

    [HttpPost]
    //[Authorize(Roles = "admin")]
    public ActionResult Edit(EditViewModel itemView)
    {

一旦动作完成,我想返回调用动作的页面。但是我不想刷新那个页面。我只想使用类似于浏览器中“上一页”按钮的内容返回到填充的屏幕。现在,当我点击“保存”时,我的操作会执行以下操作:

return RedirectToAction("Index");

有没有办法使用MVC3重定向到上一页?

点击编辑后编辑回复帖子后的Stackoverflow功能。

3 个答案:

答案 0 :(得分:2)

而不是重定向,

[HttpGet]
public ActionResult Index()
{
    /// preform any processing necessary for your index page on GET
    return View("Index");
}

[HttpPost]
public ActionResuit Edit(EditViewModel itemView)
{
  if (ModelState.IsValid)
  {
    /// do whatever you want with your model...
  }

  // return the contents as they'd be rendered by the Index action
  return Index(); 
}

请注意,使用此方法,浏览器中的网址仍会显示修改网址(如/area_name/edit),但您可以通过以下方式修复:

  1. 使用重定向(您说过您不想这样做)
  2. 使用JavaScript更新网址,或使用history.back()作为@AlanStephens建议
  3. 可能还没有立即想到的其他方法。
  4. 但是,我怀疑这是否真的是最好的方法。通常,用户希望不同的URL可以执行不同的操作。

    或者,如果我理解正确并且正在从索引页面调用编辑操作,

    [HttpGet]
    public ActionResult Index()
    {
      return View();
    }
    
    [HttpPost] /// from a form on Index
    public ActionResult Index(EditViewModel model)
    {
      if (ModelState.IsValid)
      {
        ////
      }
      return View();
    }
    

    并完全取消/Edit。同样,我并不真正关心这种方法。

答案 1 :(得分:1)

根据您提供的代码,看起来您有一个分页屏幕,可以在每一行上单击编辑。以下是我过去解决这个问题的方法。

在“索引”页面上,当页面加载时,无论是来自主索引还是分页方法,请添加以下内容:

Session["CurrentUrl"] = Request.Url.ToString();

现在,在编辑页面的POST方法结束时,执行:

return Session["CurrentUrl"] == null ?
    Index() :
    Redirect(Session["CurrentUrl"]);

答案 2 :(得分:0)

使用ajax调用可以轻松实现您所描述的内容。这样你就可以执行你喜欢和之后的任何动作(成功响应),你可以使用javascript轻松地从当前页面导航。

如果您发布到页面并作为响应返回您使用GET请求(索引页面)收到的相同视图,则某些用户可能会按F5重新加载该索引页并在浏览器中收到警告,实际上是它会再次发送POST请求。这对用户来说非常混乱,并且不是真正的用户友好(更不用说与其相关的许多问题)。

虽然你不喜欢重定向方法,但由于额外的响应,我想,我应该说,在MVC中,这是正确的方法,假设你不想使用ajax调用。