asp.net MVC частичное представление перенаправления или показать ошибку - PullRequest
1 голос
/ 06 марта 2012

У меня есть виджет входа в систему, который является частичным представлением, которое я хочу обновить с ошибками проверки модели при возникновении проблемы, в противном случае страница должна быть перезагружена.

У меня есть следующее

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>

и вызываемое действие

    [HttpPost]
    public ActionResult LogOn(LogOnModel userDetails, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(userDetails.UserName, userDetails.Password))
            {
                FormsAuthentication.SetAuthCookie(userDetails.UserName, userDetails.RememberMe);

                return Redirect(returnUrl);
            }
            ModelState.AddModelError("", "The username or password provided was incorrect");
        }

        return PartialView(userDetails);
    }

У меня это работает так, что при неправильных данных частичное представление снова отображается с ошибкамиоднако эта часть работает только в том случае, если я закомментировал другие строки javascript в успехе (контекст), которые существуют, когда пользователь успешно входит в систему и страница должна быть перенаправлена.

Есть ли лучший способ сделать это?

Я попытался вернуть анонимные объекты с помощью Json (), у которых было свойство status, и returnUrl или Html, однако я не мог понять, как получить HTML, который был бы сгенерирован PartialView (userDetails) ввызов Json (), и кажется, что в любом случае это может быть неправильным путем.

1 Ответ

1 голос
/ 06 марта 2012

Вы не можете перенаправить вызов 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...