Частичное представление Показывает свое действие в URL-адресе вместо действия просмотра контейнера

У меня есть частичное представление, содержащее форму, и это частичное представление существует в представлении, содержащем некоторые другие формы и html.
Когда я нажимаю кнопку "Отправить" и проверка не выполняется, в URL-адресе отображается это действие формы частичного представления вместо исходный URL-адрес.

Родительский вид «Учетная запись пользователя»: - Частичный просмотр входа - Частичный просмотр регистрации

Исходный URL-адрес при открытии страницы: /users/account
URL-адрес при сбое проверки регистрации становится: /users/register

Вот мой частичный взгляд:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<PicGhost.Website.ViewModels.RegisterViewModel>" %>

    <% using (Html.BeginForm("Register", "Users", FormMethod.Post)) {%>
        <%: Html.ValidationSummary(true) %>

        <fieldset>
            <legend>Fields</legend>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.UserName) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.UserName) %>
                <%: Html.ValidationMessageFor(model => model.UserName) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.Email) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.Email) %>
                <%: Html.ValidationMessageFor(model => model.Email) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.Password) %>
            </div>
            <div class="editor-field">
                <%: Html.PasswordFor(model => model.Password)%>
                <%: Html.ValidationMessageFor(model => model.Password) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.ConfirmPassword) %>
            </div>
            <div class="editor-field">
                <%: Html.PasswordFor(model => model.ConfirmPassword) %>
                <%: Html.ValidationMessageFor(model => model.ConfirmPassword) %>
            </div>

            <p>
                <input type="submit" value="Register" />
            </p>
        </fieldset>

    <% } %>

И зарегистрируйте действие:

        [HttpPost]
        public ActionResult Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                IUser user = _factory.CreateUser(model.UserName, model.Email, model.Password);
                UserRepository.Add(user);
                return RedirectToAction("Index");
            }
            return View(model);
        }

Как избежать отображения этого неправильного URL-адреса и сохранить исходный URL-адрес?

Исходный URL:
alt text

После проверки URL:
alt text


person Amr Elgarhy    schedule 24.11.2010    source источник


Ответы (2)


Вы отправляете сообщение в /users/register, и это то, что возвращает ответ.

Чтобы избежать этого либо:

  1. опубликовать действие, которое создало страницу - возможно, невозможно, если у вас есть несколько форм
  2. или вместо того, чтобы возвращать представление, верните перенаправление на исходное действие

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

person Mark    schedule 29.11.2010

Вам нужно вернуть содержащее представление. Что происходит, так это то, что, поскольку modelstate недействителен, он возвращает только частичное представление. Это означает, что каким-то образом вам нужно будет вернуть состояние модели вашего частичного представления обратно в частичное представление. Я сделал это однажды, когда в моем родительском представлении была модель, содержащая дочерние модели.

Что-то вроде этого

public class ParentViewModel
{
    public RegisterViewModel RegisterModel { get; set; }
}

Затем в представлении учетной записи

<% Html.RenderPartial("Register", Model.RegisterModel); %>

Затем вы можете построить ParentViewModel и создать дамп в RegisterViewModel, а затем вернуть представление учетной записи, когда ModelState недействителен. Внутри действия «Регистрация» у вас будет что-то вроде этого.

if (ModelState.IsValid)
{
    ...
}

var parentModel = new ParentViewModel()
{
    RegisterModel = model;
};

return View("Account", parentModel);

Просто убедитесь, что вы всегда запускаете RegisterModel, иначе вы получите сообщение об ошибке.

person Josh    schedule 24.11.2010
comment
Я сделал именно то, что вы написали в вашем примере, но это дало мне тот же результат, что и в моем вопросе :(, вы знаете, в чем проблема? - person Amr Elgarhy; 25.11.2010
comment
Поскольку вы вызываете метод Register, а последняя строка метода — return View(model);. Когда вы не указываете представление, оно возвращает представление с тем же именем, что и выполняемое в данный момент действие. В этом случае зарегистрируйтесь. - person Josh; 26.11.2010
comment
Нет, я изменил его на этот return View(Account, parentModel); как вы указали в своем ответе - person Amr Elgarhy; 26.11.2010