Проблема с данными формы и модели в MVC

На данный момент у меня проблема с формой в MVC5:

После отправки формы я отправляю запрос ajax контроллеру, который должен позаботиться об операции CRUD, а затем вернуть представление.

Если ModelState действителен, он должен вернуть пустую форму, в противном случае он должен вернуть форму с сообщениями об ошибках проверки.

Моя проблема в том, что когда мое представление возвращается, если ModelState действителен, форма не очищается, несмотря на возврат пустой модели.

Вот фактическая часть вызова ajax:

    $.ajax({
    url: urlAction,
    type: 'POST',
    data: formData,
    dataType: 'html',
    success: function(code_html) {
        $("#addUserForm").html(code_html);
    }
});

И код контроллера:

        [HttpPost]
    public ActionResult CreateUserAndContinue(AjoutUtilisateurViewModel data)
    {
        if (ModelState.IsValid)
        {
            // INSERT In DB.
            return PartialView("AjoutUtilisateurPartial", new AjoutUtilisateurViewModel());
        }
        return PartialView("AjoutUtilisateurPartial", data);
    }

Основной код представления связан:

<div id="addUserForm">
    @Html.Partial("AjoutUtilisateurPartial")
</div>

Частичный вид:

<div id="AddUserADForm">
    @using (Html.BeginForm("CreateUserAndContinue", "Habilitation", FormMethod.Post, new { @id = "addUserAD" }))
    {
        @Html.EditorForModel()
        <div class="interSmall">
            <div class="ligneOrangeHaut droite">
                <a id="btnSubmitAndContinue" class="button" href="#">Créer & Continuer</a>
                <a id="btnSubmitAndStop" class="button" href="#">Créer & Stop</a>
            </div>
        </div>
    }

</div>

Вот код формы: (вызывается EditorForModel())

@model AjoutUtilisateurViewModel

<div class="indentBig interSmall">

    <div class="col45 interSmall padding-left-5">
        @*@Html.ValidationMessage("error")*@
        @Html.ValidationMessageFor(model => model.Matricule)
    </div>

    <div class="clear-both"></div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.Matricule, new { @class = "label110" })
        @Html.TextBoxFor(x => x.Matricule)
        <a id="TestMatricule" class="button" href="#">Test</a>
    </div>
    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.EtatCompte, new { @class = "label110" })
        @Html.DropDownListFor(model => model.EtatCompte, new[] { new SelectListItem { Text = "Actif", Value = "true" }, new SelectListItem { Text = "Inactif", Value = "false" } })
    </div>
</div>

<div class="clear-both"></div>

<div class="indentBig interSmall">

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.Nom, new { @class = "label110" })
        @Html.TextBoxFor(x => x.Nom, new { disabled = "true" })
    </div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.Prenom, new { @class = "label110" })
        @Html.TextBoxFor(x => x.Prenom, new { disabled = "true" })
    </div>

    <div class="clear-both"></div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.Service, new { @class = "label110" })
        @Html.TextBoxFor(x => x.Service, new { disabled = "true" })
    </div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.Bureau, new { @class = "label110" })
        @Html.TextBoxFor(x => x.Bureau, new { disabled = "true" })
    </div>

    <div class="clear-both"></div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.Telephone, new { @class = "label110" })
        @Html.TextBoxFor(x => x.Telephone, new { disabled = "true" })
    </div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.Courriel, new { @class = "label110" })
        @Html.TextBoxFor(x => x.Courriel, new { disabled = "true" })
    </div>

    <div class="clear-both"></div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.Adresse, new { @class = "label110" })
        @Html.TextBoxFor(x => x.Adresse, new { disabled = "true" })
    </div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.CodePostal, new { @class = "label110" })
        @Html.TextBoxFor(x => x.CodePostal, new { disabled = "true" })
    </div>

    <div class="clear-both"></div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.Ville, new { @class = "label110" })
        @Html.TextBoxFor(x => x.Ville, new { disabled = "true" })
    </div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.Departement, new { @class = "label110" })
        @Html.TextBoxFor(x => x.Departement, new { disabled = "true" })
    </div>

    <div class="clear-both"></div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.OU, new { @class = "label110" })
        @Html.TextBoxFor(x => x.OU, new { disabled = "true" })
    </div>

    <div class="clear-both"></div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.ZoneLibre1, new { @class = "label110" })
        @Html.TextBoxFor(x => x.ZoneLibre1)
    </div>

    <div class="col45 interSmall padding-left-5">
        @Html.LabelFor(x => x.ZoneLibre2, new { @class = "label110" })
        @Html.TextBoxFor(x => x.ZoneLibre2)
    </div>

    <div class="clear-both"></div>

</div>

Это шаблон редактора.

Эта проблема смущает меня, потому что у меня есть действительно похожая функция, которая заполняет форму и возвращает PartialView с предустановленной моделью, которая отлично работает. Но, будучи новичком в MVC, я, вероятно, упускаю что-то важное.

Любая помощь приветствуется :)


person MagiKruiser    schedule 20.10.2014    source источник
comment
Где addUserForm определен в вашем HTML? Я его не вижу, поэтому неясно, заменяет ли его jQuery. Или предоставленный вами HTML-код определяет addUserForm (по сути, ваше частичное представление)?   -  person Ellesedil    schedule 21.10.2014
comment
Я больше не на работе, поэтому я пытаюсь ответить из того, что помню: #addUserForm является родителем PartialView ‹div id=addUserForm›@Html.Partial и т. д..‹/div› Сам частичный вид состоит только из форма + кнопка. (В значительной степени div, содержащий @Html.BeginForm + @Html.EditorFor) Я могу прояснить это только завтра, если этого недостаточно x:   -  person MagiKruiser    schedule 21.10.2014
comment
Итак, HTML, о котором идет речь, - это просто частичное представление? И HTML здесь находится внутри div addUserForm родительского представления, за пределами экрана?   -  person Ellesedil    schedule 21.10.2014
comment
HTML в вопросе взят из EditorTemplate, который включен в PartialView. Сам частичный вид в значительной степени ‹@Html.BeginForm(blabla)› @Html.EditorFor (который отображает HTML, вставленный в вопрос) ‹/form› [Еще раз я неточен, так как у меня больше нет кода передо мной банкомат, извините за это :/)   -  person MagiKruiser    schedule 21.10.2014
comment
Я отредактировал, также понял, что в случае недопустимого ModelState программа фактически ведет себя правильно (отображается сообщение об ошибке), хотя это не так, если форма заполнена правильно, несмотря на возврат предполагаемой пустой модели.   -  person MagiKruiser    schedule 21.10.2014


Ответы (2)


Я думаю, вы должны поместить все входные данные в @using(Html.BeginForm()) { ... }

person Daniil T.    schedule 20.10.2014
comment
Эй, они на самом деле. Как я уже сказал, форма взята из EditorTemplate, созданного для моей модели представления. Фактическое частичное представление имеет что-то вроде этого: P (за которым следует @Html.EditorFor()) - person MagiKruiser; 20.10.2014
comment
Я думаю, что каждый частичный должен иметь свой собственный тег формы. Или, может быть, я не понял, чего вы пытаетесь достичь - person Daniil T.; 20.10.2014
comment
Хм, думаю, ты неправильно понял. У меня единая форма. Если он заполнен правильно, контроллер должен вернуть представление с пустой формой (для этого im возвращает PartialView с пустым экземпляром модели, связанным с этой формой). В случае ошибки он должен вернуть частичное представление с тем же экземпляром модели, который использовался для отправки и отображения ошибок, но на самом деле ни одно из этих действий не происходит. (Несмотря на то, что точка останова показывает, что она возвращает PartialView (новая модель ()) или возвращает PartialView (старая модель) в соответствии с ModelState. - person MagiKruiser; 21.10.2014
comment
Не могли бы вы опубликовать код основного вида, пожалуйста? Потому что я не уверен, что можно иметь частичную внутреннюю форму. У вас должна быть отдельная форма для каждого частичного представления, а затем после сбоя она заполнит ваши входные данные моделью. Так или иначе, вам было бы легче помочь, если бы вы могли предоставить код представления, где вы пытаетесь вставить частичное представление. - person Daniil T.; 21.10.2014
comment
Как я уже сказал, меня не было на работе, поэтому я не могу опубликовать больше кода до завтра; но сделает. Форма находится внутри частичного представления, а не наоборот D: - person MagiKruiser; 21.10.2014
comment
Я отредактировал, также понял, что в случае недопустимого ModelState программа на самом деле ведет себя правильно (отображается сообщение об ошибке) - вчера, конечно, слишком устала ..., хотя это не так, если форма заполнена правильно, несмотря на возвращение предполагаемого пустая модель. - person MagiKruiser; 21.10.2014
comment
Подойдет, мне нужно подождать 24 часа, прежде чем принять мой собственный ответ в качестве ответа: P - person MagiKruiser; 21.10.2014

Что ж, к новому дню, новым идеям, в итоге это стало почти дубликатом этой темы:

Сбросить значение textarea после отправки формы

Спасибо автору оригинального ответа, который решил проблему. =р

В значительной степени при возврате запроса POST представление возвращает данные чтения из ModelState вместо самой модели, поэтому возврат пустой модели ничего не изменит.

person MagiKruiser    schedule 21.10.2014