5 Stimmen

ASP MVC-3: Probleme beim Aktualisieren der Daten eines AJAX-Formulars nach dem Absenden

Ich habe das folgende Problem beim Aktualisieren eines Formulars über AJAX, nachdem es eingereicht wurde. Aus irgendeinem Grund werden einige versteckte Felder, die im zurückgegebenen HTML vorhanden sind, nicht aktualisiert, was seltsam ist, denn wenn ich den Debugger ausführe, scheinen sie den richtigen Wert zu haben.

Das ist der relevante Teil meines Formulars

    @{Html.EnableClientValidation();}
    @Html.ValidationSummary()

        @{ Html.RenderPartial("ItemData", Model, new ViewDataDictionary() { { "Machines", ViewBag.Machines }, { "WarehouseList", ViewBag.WarehouseList }, { WebConstants.FORM_ID_KEY, @ViewData[WebConstants.FORM_ID_KEY] } }); }

Dann enthält die Partial View versteckte Felder wie diese, die nicht aktualisiert werden

@using (Html.BeginForm("Index", "Item", FormMethod.Post, new { id = "frmItem", name = "frmItem" }))
{ 
    @Html.AntiForgeryToken()
    @Html.HiddenFor(model => model.Item.SodID)
    @Html.HiddenFor(model => Model.Item.ItemID) //Die ItemID muss aktualisiert werden, wenn ein Artikel kopiert wird
    @Html.HiddenFor(model => model.Item.Delivery.DeliveryAddressID, new { @id = "delAddressID" }) 

Und das ist die JavaScript-Methode, die das Formular aktualisiert

function ajaxSave() {
        if (!itemValid()) return; 
        popup('ajaxSplash');
        $.ajax({
            type: "POST",
            url: '@Url.Action("Index")',
            data: $("#frmItem").serialize(),
            success: function (html) {
                console.log(html);
                $("#formDiv").html(html);
                initItemPage();
                alert("Der Artikel wurde erfolgreich gespeichert");
            },
            error: function () { popup('ajaxSplash'); onFailure(); }
        });
    }

Die Aktion Index gibt die Partial View "ItemData" zurück, und wenn ich das Item Model überprüfe, hat es den richtigen Wert, aber wenn ich das zurückgegebene HTML überprüfe, ist es immer noch auf 0 gesetzt.

6voto

Darin Dimitrov Punkte 990883

Wenn Sie beabsichtigen, eine Modelleigenschaft in Ihrer POST-Aktion zu ändern, vergessen Sie nicht, sie zuerst aus dem ModelState zu entfernen, da HTML-Helfer den ursprünglich geposteten Wert verwenden, wenn sie gerendert werden:

[HttpPost]
public ActionResult Index(MyViewModel model)
{
    // Wert aus ModelState entfernen
    ModelState.Remove("Item.ItemID");

    // Wert aktualisieren
    model.Item.ItemID = 2;   

    return PartialView(model);
}

0voto

sabotero Punkte 4135

Ich habe das gleiche Problem und es sieht so aus, als ob der Helfer HiddenFor mit erforderlicher nicht aufdringlicher Validierung auswertet, auch wenn in dem Modell das Attribut [Erforderlich] nicht annotiert ist.

Das HTML, das von @Html.HiddenFor(m=>m.Step) gerendert wird, ist :

Daher funktioniert es, wenn wir es aus dem ModelState entfernen.

Das Entfernen der Eigenschaft aus dem ModelState erscheint mir wie ein Hack. Ich würde es vorziehen, zu benutzen

anstatt des Html.HiddenFor Helfers.

Sie können auch Ihren eigenen HiddenFor-Helfer implementieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X