.net MVC中的表单和模型数据问题

.net MVC中的表单和模型数据问题,.net,ajax,forms,model-view-controller,asp.net-mvc-partialview,.net,Ajax,Forms,Model View Controller,Asp.net Mvc Partialview,目前,我对MVC5中的表单有一个问题: 提交表单后,我将向控制器发送一个ajax请求,控制器应负责CRUD操作,然后返回一个视图 如果ModelState有效,它应该返回一个空表单,否则,它应该返回带有验证错误消息的表单 我的问题是,当我的视图被返回时,如果ModelState是有效的,那么即使返回了一个空模型,表单也不会被清空 下面是实际的ajax调用部分: $.ajax({ url: urlAction, type: 'POST', data: formDat

目前,我对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的新手,我可能错过了一些重要的事情


非常感谢您的帮助:

我认为您应该将所有输入都放到 @使用html.BeginForm { ...
}

对于新的一天,新的想法,它最终几乎是这条线索的复制品:

多亏了原来的答案,作者解决了这个问题=p


几乎在返回POST请求时,视图返回从ModelState而不是模型本身读取的数据,因此返回空模型不会改变任何事情。

嘿,实际上是这样。如前所述,表单取自为viewmodel制作的EditorTemplate。实际的部分视图有如下内容:P后跟@Html.EditorForI我认为每个部分都应该有自己的表单标记。或者也许我不明白你想要达到什么,嗯,我想你误解了。我只有一张表格。如果已正确填充,则控制器应为此im返回带有空表单的视图,并返回带有与此表单关联的空模型实例的PartialView。如果出现错误,它应该返回partialview,其中包含用于提交和显示错误的同一个模型实例,但这些行为实际上都没有发生。尽管断点显示它将返回partialViewownew模型或根据模型状态返回partialViewWoldModel。请发布主视图代码,好吗?因为我不确定是否可能有部分内部形式。对于每个局部视图,您应该有单独的表单,然后在失败后,它将用模型填充您的输入。不管怎样,如果你能在你试图插入部分视图的地方提供视图代码,这会更容易帮助你,因为我说我不在工作,所以明天才能发布更多的代码;但我会的。表单在partialview中,而不是在D中:addUserForm在HTML中定义在哪里?我没有看到它,所以不清楚jQuery是否正在取代它。或者您提供的定义addUserForm的HTML本质上是您的局部视图吗?我不再工作了,所以我试图从我记忆中回答:addUserForm是PartialView@HTML.partial等的父视图。。partialview本身仅由form+按钮组成。几乎是一个包含@Html.BeginForm+@Html.EditorFor的div,如果不够的话,我明天才能更好地解决这个问题x:那么,问题中的Html只是部分视图?这里的HTML位于父视图的addUserForm div中,屏幕外?问题中的HTML取自PartialView中包含的EditorTemplate。partialview本身是prettymuch@Html.editor,用于显示问题中粘贴的Html[我再一次犯了错误,因为我面前不再有代码了,很抱歉:/我编辑过,也意识到在模型状态无效的情况下,程序实际上运行正常,显示错误消息,尽管返回了预期的空模型,但如果表单填写正确,则不正确。