想象一下我在页面上有一个子表单的场景。此子表单包含在部分用户控件中,并发布到其自己的专用 Controller 操作。如果违反了业务规则,我想返回用户之前所在的相同 View 。
示例:
- 用户位于呈现部分“SignOnForm”的/example/page1
- SignOn 表单发布到“Accounts/SignOn”。
- 如果某些内容无效,我想将用户返回到/example/page1 并保持模型状态完好无损。但是,我无法对 View 进行硬编码,因为用户可能位于不同的页面上,例如/othercontroller/page10。
最佳答案
您可以使用请求查询字符串在整个 SignOn 过程中引入返回 URL。
首先,指定每次呈现 SignOn 部分时要返回的页面:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="Microsoft.Web.Mvc"%>
<!-- Your Example/Page1 page -->
<% if (!User.IsAuthenticated) %>
<%= Html.RenderAction("SignOn", "Account", new { returnUrl = Request.Url.PathAndQuery }); %>
如果当前上下文不是帐户 Controller ,则使用 RenderAction。该功能目前不在 MVC 版本中,因此您需要包含 ASP.NET MVC's Future library在您的解决方案中。
接下来,SignOn Controller :
public ActionResult SignOn(string returnUrl)
{
if (User.Identity.IsAuthenticated)
{
User user = userRepository.GetItem(u => u.aspnet_UserName == User.Identity.Name);
return !string.IsNullOrEmpty(returnUrl)
? Redirect(returnUrl)
: (ActionResult) RedirectToAction("Index", "Home");
}
return PartialView();
}
登录表单:
<% using (Html.BeginForm("SignOn", "Account", new { returnUrl = Request.QueryString["returnUrl"] },FormMethod.Post,new {@class="my_signOn_class"}))
{ %>
<!-- Form -->
<% } %>
最后,在处理表单 POST 的 SignOn Controller 中,您可以使用以下代码将用户返回到“returnURL”:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SignOn(FormCollection formCollection, string returnUrl)
{
if (BusinessRuleViolated(formCollection))
{
if(!string.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
return RedirectToAction("Index", "Home");
}
// SignIn(...)
}
关于asp.net-mvc - asp.net mvc - 如何将用户返回到上一个操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1369296/