代码之家  ›  专栏  ›  技术社区  ›  Chris

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

  •  3
  • Chris  · 技术社区  · 16 年前

    想象一个场景,我在一个页面上有一个子表单。此子窗体包含在部分用户控件中,并发布到其自己的专用控制器操作。在违反业务规则的情况下,我希望返回用户以前所在的视图。

    例子:

    • 签到表张贴到“账户/签到”。
    • 如果某个内容无效,我希望将用户返回到/example/page1,模型状态为tact。但是,我无法硬编码视图,因为用户可能位于不同的页面,如/othercontroller/page10。
    2 回复  |  直到 16 年前
        1
  •  2
  •   Matthew Perron    16 年前

    您可以使用请求查询字符串,在整个登录过程中一直显示返回URL。

    <%@ 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 }); %>
    

    如果当前上下文不是帐户控制器,请使用RenderAction。该特性目前不在MVC版本中,因此您需要包括 ASP.NET MVC's Future library 在你的解决方案中。

    接下来,SignOn控制器:

    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控制器中,可以使用以下代码将用户返回到“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(...)
    }
    
        2
  •  0
  •   Dan Atkinson    16 年前
    public SignOn(string username, string password)
    {
      //login logic here
      ...
    
      //Now check if the user is authenticated.
      if(User.IsAuthenticated)
      {
        //Redirect to the next page
        return RedirectToAction("page10", "Other");
      }
      else
      {
        // You could also pass things such as a message indicating the user was not authenticated.
        return RedirectToAction("page1", "Example");
      }
    }
    

    此外,您可以随时将上一个“良好”发布页面中的表单数据转储到隐藏的表单字段中,并让用户单击“返回”按钮,从而有效地将它们转发到上一个页面。我并不特别喜欢这样,因为这意味着您必须维护以前的表单字段。