【问题标题】:asp.net mvc using ajax, but the callback won't redirectasp.net mvc 使用 ajax,但回调不会重定向
【发布时间】: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 的值将为空。
  • 您也没有在_LoginPartial POST 操作方法中设置ViewBag.ReturnUrl
  • 我认为 JavaScript 也可以使用一些分号。
  • @asymptoticFault 我喜欢你一直在我身边,伙计!我忘了包含父视图控制器,我会发布它以及设置 URL 的位置。部分中的返回网址来自旧代码,未使用。我想如果父视图中有 returnURL,javascript 回发将能够使用父视图 CustomScripts 部分中呈现的脚本。至于分号,当我把它们扔进去时,它们总是给我一个语法错误。

标签: asp.net-mvc asp.net-mvc-4 asp.net-ajax


【解决方案1】:

问题是我直接在我的 javascript 中访问 viewbag。答案是用这个替换我的javascript。

@section CustomScripts {
 <script type ="text/javascript">
     function OnSuccess() {
         var returnUrl = @Html.Raw(Json.Encode(ViewBag.ReturnUrl))
         window.location = returnUrl;
    }
</script>

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多