Частичное представление Показывает свое действие в URL вместо действия просмотра контейнера. - PullRequest
1 голос
/ 25 ноября 2010

У меня есть частичное представление, которое содержит форму, и это частичное представление существует в виде, которое содержит некоторые другие формы и 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

Ответы [ 2 ]

2 голосов
/ 29 ноября 2010

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

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

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

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

0 голосов
/ 25 ноября 2010

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

Примерно так

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

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

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

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

if (ModelState.IsValid)
{
    ...
}

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

return View("Account", parentModel);

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

...