【发布时间】:2013-09-03 19:03:02
【问题描述】:
我在同一个父视图中为两个不同的局部视图使用 ajax。 ajax请求提交成功,调用了OnSuccess()函数,但是页面不会重定向。这是我的代码。我已经确定 returnurl 是一个绝对地址。 查看:
@{
ViewBag.Title = "Log in/Register";
}
<hgroup class="title">
<h1>@ViewBag.Title.</h1>
</hgroup>
@section CustomScripts {
<script type ="text/javascript">
function OnSuccess(){
var returnUrl = @ViewBag.ReturnUrl
window.location = returnUrl
}
</script>
}
<section id="loginForm">
@{
if(!WebSecurity.IsAuthenticated){
<h2>Use a Creative Works account to log in.</h2>
@Html.Action("_LoginPartial", new {returnUrl = ViewBag.ReturnUrl })
}
}
</section>
<section id ="RegisterForm">
@{
if(!WebSecurity.IsAuthenticated){
<span>Don't have an account? Make one!</span>
@Html.Action("RegisterPartial", new { returnUrl = ViewBag.ReturnUrl })
}
}
</section>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
用于登录的部分视图:
@{
ViewBag.Title = "LoginPartial";
}
@using (Ajax.BeginForm("_LoginPartial", new {returnUrl = ViewBag.ReturnUrl},
new AjaxOptions(){UpdateTargetId = "loginForm",
InsertionMode = InsertionMode.Replace, OnSuccess = "OnSuccess"
})) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Log in Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</li>
<li>
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe, new { @class = "checkbox" })
</li>
</ol>
<input type="submit" value="Log in" />
</fieldset>
}
和控制器:
[AllowAnonymous]
public ActionResult _LoginPartial(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return PartialView(new LoginModel());
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult _LoginPartial(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return PartialView();
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return PartialView(model);
}
编辑: 父视图控制器
[AllowAnonymous]
[DisableCache]
public ActionResult Login(string returnUrl ="/")
{
var path = VirtualPathUtility.ToAbsolute(returnUrl);
var url = new Uri(Request.Url, path).AbsoluteUri;
ViewBag.ReturnUrl = url;
return View();
}
【问题讨论】:
-
如果包含
OnSuccess函数的视图未呈现为_LoginPartial部分视图的一部分,则@ViewBag.ReturnUrl的值将为空。 -
您也没有在
_LoginPartialPOST 操作方法中设置ViewBag.ReturnUrl。 -
我认为 JavaScript 也可以使用一些分号。
-
@asymptoticFault 我喜欢你一直在我身边,伙计!我忘了包含父视图控制器,我会发布它以及设置 URL 的位置。部分中的返回网址来自旧代码,未使用。我想如果父视图中有 returnURL,javascript 回发将能够使用父视图 CustomScripts 部分中呈现的脚本。至于分号,当我把它们扔进去时,它们总是给我一个语法错误。
标签: asp.net-mvc asp.net-mvc-4 asp.net-ajax