我需要在主页上显示注册表和登录表。
如果在这两个表单上验证失败,我需要在主页上显示正确的错误。
但如果没有错误,则必须将用户重定向到受保护的仪表板。
为实现这一目标,我在主页上使用child action
,如下所示:
@Html.Action("Register", "Membership")
如果有任何错误,它会按预期完美地工作,因为它能re-render
partial view
model
validation state
有Child actions are not allowed to perform redirect actions.
信息。
但如果没有错误,当它尝试重定向时,会抛出错误说明:
{{1}}
这有什么办法吗?我确信有一种方法可以在主页上放置注册和登录表单。很可能我不知道,因为我是ASP .Net MVC的新手。
你能指出我在正确的方向吗?
答案 0 :(得分:6)
执行此操作的一种方法是使用ajax表单作为登录和注册位,而不是在提交有效时返回RedirectResult,返回一些json,其中一些客户端脚本将注意并使用为你做一个重定向。
这是一个简化的例子。
控制器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;
using MvcApplication12.Models;
namespace MvcApplication12.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Register()
{
return PartialView(new UserDetails());
}
[HttpPost]
public ActionResult Register(UserDetails details)
{
if (ModelState.IsValid)
{
return Json(new {redirect = true, url = Url.Action("Index","Dashboard")});
}
else
{
return PartialView(details);
}
}
}
}
主页'索引'视图:
@{
ViewBag.Title = "Index";
}
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script type="text/javascript">
function checkForRedirect(data)
{
if (data.redirect && data.url)
{
location.href = data.url;
}
}
</script>
<p>Home page stuff.....</p>
<div id="RegistrationArea">
@Html.Action("Register")
</div>
<p> Home page stuff.....</p>
注册表'注册'部分视图:
@model MvcApplication12.Models.UserDetails
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Ajax.BeginForm(new AjaxOptions()
{
HttpMethod = "POST",
Url = Url.Action("Register", "Home"),
OnSuccess = "checkForRedirect(data)",
UpdateTargetId = "RegistrationArea",
InsertionMode = InsertionMode.Replace
}))
{
@Html.LabelFor(m => m.UserName)
@Html.EditorFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
@Html.LabelFor(m => m.Password)
@Html.EditorFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
<input type="submit" />
}
答案 1 :(得分:2)
您不应该在该上下文中使用子操作。
您的问题的解决方案可能是 在您的页面中放置两个表单用于注册,一个用于登录。注册表单发布到成员控制器中的Register操作,登录操作发布到成员控制器中的Login操作。
如果其中一个操作发生错误,您可以:
答案 2 :(得分:1)
不使用javascript进行重定向: 如果将表单放在子视图中,有时如果在Beginform帮助器(子视图内)中指定操作名称和控制器名称,则此问题不会发生。例如,我改变了我的子动作视图:
之前:
@using (Html.BeginForm())
{
...
}
之后:
@using (Html.BeginForm("InsertComment", "Comments", FormMethod.Post, new { id = "commentform" }))
{
...
}
现在,您可以将RedirectAction命令放入&#34; InsertComment&#34;行动,一切都会奏效。
一页管理中的两种形式:
1.指定提交按钮的名称(每个表格)(例如:&#34;提交值&#34;)
Form1中:
<input type="submit" value="login" name="submitValue" class="btn btn-success pull-right" />
窗口2:
<input type="submit" value="register" name="submitValue" class="btn btn-success pull-right" />
2.对这些表单采取两项措施。 (例如:&#34;注册&#34;和&#34;登录&#34;)
[HttpPost]
public ActionResult Login(LoginVM model, string submitValue)
{
if (submitValue == "login")
{
//Do Something
}
...
}
[HttpPost]
public ActionResult Register(RegisterVM model, string submitValue)
{
if (submitValue == "register")
{
//Do Something
}
...
}
- 如果您单击表单中的注册或登录按钮,则会调用这两个操作,但使用&#34;如果&#34;声明我们确定哪个是我们的目标。