Ajax asp.net mvc部分视图重定向或显示错误

Ajax asp.net mvc部分视图重定向或显示错误,ajax,asp.net-mvc-3,redirect,partial-views,Ajax,Asp.net Mvc 3,Redirect,Partial Views,我有一个登录小部件,它是一个局部视图,我希望在出现问题时使用模型验证错误进行更新,否则应该重新加载页面 我有以下几点 LogOn.cshtml @{ var ajaxOpts = new AjaxOptions {OnSuccess = "success"}; } <div id="login"> @Html.ValidationSummary(excludePropertyErrors: true) <h2>Start by Logging

我有一个登录小部件,它是一个局部视图,我希望在出现问题时使用模型验证错误进行更新,否则应该重新加载页面

我有以下几点

LogOn.cshtml

@{
    var ajaxOpts = new AjaxOptions {OnSuccess = "success"};
}

<div id="login">
    @Html.ValidationSummary(excludePropertyErrors: true)

    <h2>Start by Logging in</h2>

    @using (Ajax.BeginForm("LogOn", "Account", ajaxOpts))
    {
        @Html.Hidden("returnUrl", Request.Url.PathAndQuery)

        <table width="100%" border="0" cellspacing="0" cellpadding="5">
            <tr>
                <td>
                    <span class="bluey">Username:</span><br />
                    @Html.TextBoxFor(m => m.UserName, new {tabindex = "1", Class = "field"})
                    @Html.ValidationMessageFor(m => m.UserName, "*")
                </td>
                <td>
                    <span class="bluey">Password:</span><br />
                    @Html.TextBoxFor(m => m.Password, new {tabindex = "2", Class = "field"})
                    @Html.ValidationMessageFor(m => m.Password, "*")
                </td>
            </tr>
            <tr>
                <td>
                    <input name="login" type="submit" value="Submit" class="input_btn" tabindex="3" />
                </td>
                <td>@Html.CheckBoxFor(m => m.RememberMe) @Html.LabelFor(m => m.RememberMe) <span class="bluey">&nbsp; | &nbsp;</span> @Html.ActionLink("Forgot Password?", "Password", "User")</td>
            </tr>
        </table>
    }
</div>

<script>
    function success(context) {
        //var returnUrl = context.get_data().returnUrl;
        //if (returnUrl) {
        //    window.location.href = returnUrl;
        //} else {
            $("#login").replaceWith(context);
        //}

    }

</script>
我让它工作,以便当数据不正确时,部分视图会重新显示并出现错误。但是,只有在用户成功登录并重定向页面时,我注释掉了成功(上下文)中的其他javascript行,这一部分才起作用

有更好的方法吗


我确实尝试使用Json()返回匿名对象,该对象具有status属性和returnUrl或Html,但是我不知道如何将PartialView(userDetails)生成的Html获取到Json()调用中,这似乎是一种错误的处理方式。

在AJAX调用中无法重定向。您可以从服务器返回一个JSON对象,指向要重定向到的url,然后在成功回调中执行实际的重定向

function success(result) {
    if (result.returnUrl) {
        // the controller action returned JSON
        window.location.href = returnUrl;
    } else {
        // the controller action returned a partial
        $('#login').html(result);
    }
}
现在,如果控制器操作成功,只需返回返回url,而不是重定向:

return Json(new { returnUrl = returnUrl });

顺便说一句,您似乎已经在视图中找到了返回url:
Request.url.PathAndQuery
。我不认为让它在服务器上来回传输有什么意义。您只需返回一些表示成功的JSON布尔值,并在成功回调中执行重定向到url。

我想知道我是否使用了jquery.ajax,因为它似乎支持状态代码,这是否有效?@DanielPowell,这正是UnobtrusiveAjax在封面下使用的->jquery.ajax。因此,这将是完全相同的。当然,它不会与jquery.ajax或任何ajax调用一起工作,即使是最基本的内置浏览器XmlHttpRequest对象。如果在服务器中重定向,客户端将自动跟随重定向,直到到达最终目的地,当然,该目的地的状态代码为200。
return Json(new { returnUrl = returnUrl });