asp.net-mvc - asp.net mvc - 如何将用户返回到上一个操作?

标签 asp.net-mvc

想象一下我在页面上有一个子表单的场景。此子表单包含在部分用户控件中,并发布到其自己的专用 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/

相关文章:

c# - 在 Asp.net Mvc 5 应用程序中将用户分配给项目列表

c# - 模型 MVC 5 的 session 数据

sql-server - Elmah.MVC + NLog - 将所有错误存储在一个地方

c# - 是否建议为每个客户端请求创建线程?

从 asp.net mvc ajax 调用 wcf

asp.net-mvc - MVC 对 HiddenFor 的 lambda 处理方式与 DisplayFor 不同

c# - 共享连接字符串

asp.net-mvc - 如何在asp.net mvc 应用程序中自动生成随 secret 码?

c# - .NET MVC 应用程序中所有 HTTP GET 操作的 OnActionExecuted 代码

javascript - 在html页面中添加Home按钮