想象一下我在页面上有一个子表单的场景。此子表单包含在部分用户控件中,并发布到其自己的专用控制器操作。如果违反了业务规则,我想返回用户之前所使用的相同视图。
示例:
答案 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");
}
}
此外,您始终可以将表单数据从最后一个“好”发布页面转储到隐藏表单字段中,并让用户单击“返回”按钮,该按钮可以有效地将它们发送到上一页。我并不特别喜欢这个,因为这意味着您必须维护以前的表单字段。