MVC4 PartialViewResult возвращает представление, а не PartialView

В моем приложении есть страница LogInOrRegister, которая вызывает 2 дочерних действия LogInOrRegister.cshtml

@{
    ViewBag.Title = "Log in";
}

@Html.Action("Login", "Account", new { returlUrl = ViewBag.ReturnUrl})
@Html.Action("Register", new { returlUrl = ViewBag.ReturnUrl})

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

PartialView для входа в систему:

@model Com.WTS.Portal.Models.LoginModel
<hgroup class="title">
    <h1>@ViewBag.Title</h1>
</hgroup>

<section id="loginForm">
<h2>Use a local account to log in.</h2>
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
    <legend>Log in Form</legend>
    <ol>
        <li>
            @Html.LabelFor(m => m.Email)
            @Html.TextBoxFor(m => m.Email)
            @Html.ValidationMessageFor(m => m.Email)
        </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>
}
</section>

Мой AccountController.cs содержит следующий код:

    [AllowAnonymous]
    public PartialViewResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
        return PartialView();
    }

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public PartialViewResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.Email, model.Password, persistCookie: model.RememberMe))
        {
            RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return PartialView(model);
    }

Я правильно вижу 2 частичное представление Я ПОЛУЧАЮ страницу LogInOrRegister.cshtml

Когда я отправляю форму, если в форме есть ошибки проверки, отображается представление (без макета) вместо частичного представления, которое должно быть частью LogInOrRegster

Любая идея?

3 ответа

Решение

Хорошо, я нашел решение. Передав параметры маршрута в форму частичного просмотра:

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))

Я думаю, что мы изменим поведение ребенка. Только удалив атрибут маршрута:

@using (Html.BeginForm())

PartialView отображается в своем контейнере. Также мы можем определить действие POST как ChildActionOnly, оно все еще работает:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
[ChildActionOnly]
public PartialViewResult Login(LoginModel model, string returnUrl)

Поэтому, если вы посмотрите на обсуждение найденного здесь /questions/30814315/ispolzovanie-childactiononly-v-mvc/30814317#30814317 вы увидите, что атрибут ChildActionOnlyAttribute используется для того, чтобы действие могло отображаться внутри представления, но не могло передаваться браузеру.,

Если тип возврата PartialViewResultукажите в методе имя частичного вида вместе с моделью public PartialViewResult Login(LoginModel model, string returnUrl) иначе использовать ActionResult как тип возврата.ActionResult абстрактный класс, где как PartialViewResult это подкласс.

Другие вопросы по тегам