是否可以返回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中可能吗?如果是,该如何实现?
答案 0 :(得分:2)
history.go(-1)的问题在于,如果您刚刚提交了表单,它将尝试再次提交该表单...
也许您可以添加一个全局操作过滤器,该过滤器可以使用以下方式检查引荐来源网址:
Request.Headers["Referer"]
然后像您建议的那样将引荐网址存储在cookie中,但仅在检查它是GET而不是帖子后才存储?
答案 1 :(得分:1)
如果您使用的是.Net Core 3.1,则控制器方法中的这一行将重定向到上一页
return Redirect(HttpContext.Request.Headers["Referer"]);
这就是您所需要的。...
答案 2 :(得分:0)
不确定这是否正确,但我通过以下方式“入侵”了
void
Response.StatusCode = 204
(204是成功代码,没有其他内容)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" />
}