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

时间:2009-09-02 18:12:42

标签: asp.net-mvc

想象一下我在页面上有一个子表单的场景。此子表单包含在部分用户控件中,并发布到其自己的专用控制器操作。如果违反了业务规则,我想返回用户之前所使用的相同视图。

示例:

  • 用户位于/ example / page1,呈现部分“SignOnForm”
  • 签署表格帖子“Accounts / SignOn”。
  • 如果某些内容无效,我想将用户返回到带有模型状态的/ example / page1。但是,我无法对视图进行硬编码,因为用户可能位于不同的页面上,例如/ othercontroller / page10。

2 个答案:

答案 0 :(得分:2)

您可以使用请求查询字符串在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 }); %>

如果当前上下文不是帐户控制器,请使用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();
}

SignOn表格:

 <% using (Html.BeginForm("SignOn", "Account", new { returnUrl = Request.QueryString["returnUrl"] },FormMethod.Post,new {@class="my_signOn_class"}))
    { %>
         <!-- Form -->
 <% } %>

最后,在处理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(...)
}

答案 1 :(得分:0)

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");
  }
}

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