MVC核心-返回上一页

时间:2018-08-14 14:20:54

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

是否可以返回ASP.Net Core中controller操作的上一页?

示例:

假设我们有以下controllers

  • HomeController,操作Index()返回View()
  • BlogPostController,操作BlogPosts()返回View(model)
  • PostController(相同),操作BlogPost(int postId)返回View(model)

_Layout上还有一个按钮(因此在所有其他Views中都可用),单击该按钮即可执行DoSomething()中的动作GlobalController。我的应用程序中的所有DoSomething()都可以调用Views,因此我希望它只创建一个cookie并重新加载上一页,而不必重定向到确切的操作。

更具体地说:如果我在DoSomething()上致电http://mysite/index,我希望它创建一个cookie,然后返回http://mysite/index并重新加载它。我在http://mysite/BlogPost?postId=13时的情况也是如此。

在ASP.Net Core 2.0中可能吗?如果是,该如何实现?

4 个答案:

答案 0 :(得分:2)

history.go(-1)的问题在于,如果您刚刚提交了表单,它将尝试再次提交该表单...

也许您可以添加一个全局操作过滤器,该过滤器可以使用以下方式检查引荐来源网址:

Request.Headers["Referer"]

然后像您建议的那样将引荐网址存储在cookie中,但仅在检查它是GET而不是帖子后才存储?

答案 1 :(得分:1)

如果您使用的是.Net Core 3.1,则控制器方法中的这一行将重定向到上一页 return Redirect(HttpContext.Request.Headers["Referer"]);

这就是您所需要的。...

答案 2 :(得分:0)

不确定这是否正确,但我通过以下方式“入侵”了

  1. 将我的控制器操作返回类型更改为void
  2. 在控制器操作中设置Response.StatusCode = 204(204是成功代码,没有其他内容)
  3. 成功使用location.reload()通过ajax从View调用我的操作

如果您对该解决方案有任何意见,请告诉我们。我不确定是否要遵循这种方法,所以很高兴听到经验丰富的Web开发人员的意见。

答案 3 :(得分:0)

[HttpGet] // This isn't required
public ActionResult Edit(int id)
{
    // load object and return in view
    ViewModel viewModel = Load(id);

    // get the previous url and store it with view model
    viewModel.PreviousUrl = System.Web.HttpContext.Current.Request.UrlReferrer;

    return View(viewModel);
}

[HttpPost]
public ActionResult Edit(ViewModel viewModel)
{
    // Attempt to save the posted object if it works, return index if not return the Edit view again

    bool success = Save(viewModel);
    if (success)
    {
        return Redirect(viewModel.PreviousUrl);
    }
    else
    {
        ModelState.AddModelError("There was an error");
        return View(viewModel);
    }
}

您的视图的BeginForm方法也不需要使用此返回URL,您应该可以逃脱:

@model ViewModel

@using (Html.BeginForm())
{
    ...
    <input type="hidden" name="PreviousUrl" value="@Model.PreviousUrl" />
}