Frage

Ich habe ein Problem in einer Form wieder auftaucht ich zu schreiben bin versucht. In dem Szenario, in dem die Form überprüft nicht, nehme ich die Standardroute ModelState.AddModelError() dann den Aufruf eine Ansicht Ergebnis zurück.

Die Sache ist, die HTML. * Helfer sollen den gebuchten Wert holen beim Rendern und ich bemerken, dass mein Textfeld nur dann tun, wenn ich sie in der Parameterliste der Postback Aktion enthalten, die shouldn‘ t erforderlich sein zu sehen, wie einige Formen zu viele Felder haben wollen sie alle als Parameter aufzulisten.

Mein Aktionscode ist in etwa:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name)
{
    var dataDefinition = ...

    // do some validation stuff
    if (!ModelState.IsValid)
    {
        // manually set checkbox fields via ViewData seeing as this STILL doesn't work in MC 1.0 :P
        // ...
        return View(dataDefinition);
    }

}

Nun Datadefinition (die ein LINQ to SQL-Entität) hat ein Feld MinVolume , in der Ansicht von dieser Linie behandelt:

Minimum: <%= Html.TextBox("MinVolume", null, new { size = 5 })%>

Doch wenn der Blick nach gescheitertem Model Validierung gemacht wird, wird der Wert eingegeben hinein auf der Originalseite verzeichnen wir nicht erhalten, wenn ich es als Parameter in dem Postback-Verfahren umfasse. Wahrsten Sinne des Wortes, das kann ich „das Problem lösen“, indem Sie diese:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name, string minVolume)

Aus irgendeinem Grund, den Feldwert zwingen wird, erhalten bleiben. Das scheint mir dumm, weil meine Form so mehr Werte hat als nur das, und ich sollte das Feld nicht nur für einen Parameter hinzufügen.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Könnte es sein, dass Ihr Code:

<%= Html.TextBox("MinVolume", null, new { size = 5 })%>

.. hat die null für den Standardwert param? Vielleicht den Wert anhalten wird es, wenn Sie die null Model.MinVolume ändern. Wie folgt aus:

<%= Html.TextBox("MinVolume", Model.MinVolume, new { size = 5 })%>

Ich bin mir nicht sicher, ob die Aktion den Wert MinVolume im Modell tho zurückgibt. Ist dies der Fall, sollte die oben arbeiten. Else, müssen Sie die Aktion etwas Refactoring.

Andere Tipps

Oh Mann, ich habe gerade mein Anwendungsdesign verbessert. Das Problem tritt auf, weil Sie benutzerdefinierte Validierung (ich habe auch) haben. Sie haben nach dem

hinzufügen
ModelState.AddModelError()

Dieses

ModelState.SetModelValue("MinVolume", ValueProvider["MinVolume"]);

Im Hinblick muss es sein

Mimum:<%=Html.Textbox("MinVolume")%>

Immer noch nicht sicher, warum es funktioniert, aber es funktionierte für mich.

Was ist der Schlüssel Sie verwenden, wenn Sie den Wert in der Modelstate auf Fehler gesetzt? Der Code, der den Wert Parameter für eine TextBox setzt wie folgt aussieht:

Relevante Teil der Framework-Code heruntergeladen rel="nofollow.

string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue);

Wie Sie sehen können, wenn der Versuch Wert vorhanden ist, wird es sie verwenden - aber nur, wenn der gleiche Schlüssel ist verfügbar

.

Ich weiß, dass dies funktioniert, weil ich eine Aktion, die keine Parameter annimmt und erhält die Werte direkt aus dem Valueprovider und verwendet AddModelError Validierungsfehler anzuzeigen. Ich bin sicher, dass die Werte in meinen Textfeldern beibehalten werden.

Bearbeiten : Damit die Werte beibehalten werden, müssen sie in irgendeiner Weise mit dem Modell verbunden sein. Eine Möglichkeit, dies zu tun ist, um sie zu der Parameterliste hinzuzufügen. Ein anderer Weg ist Update zu verwenden (mit den Parameternamen in der Whitelist oder ohne weiße Liste). Eine dritte Möglichkeit besteht darin, die Parameter explizit auf das Modell wie in @ Jenea Antwort hinzuzufügen. Da nur die Helfer aus dem Modellzustand ziehen, müssen sie dort sein, wenn die Werte beibehalten werden. Es sieht nicht auf der Formulareigenschaft Anfrage erhältlich.

Wie ich verstehe die Lösung ist:

[Transaction]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(int id, FormCollection form)
{
    T itemToUpdate = repository.Get(id);
    UpdateModel(itemToUpdate, form.ToValueProvider());

    if (itemToUpdate.IsValid())
    {
        repository.SaveOrUpdate(itemToUpdate);
        return Json(ValidationResultToJson(itemToUpdate.ValidationResults()));
    }

    repository.DbContext.RollbackTransaction();
    return Json(ValidationResultToJson(itemToUpdate.ValidationResults()));
}

viel Glück!

Eine andere Lösung ist, wenn Sie in Ansicht ein:

<%var minVolume=Request["MinVolume"]??"";%>
<%=Html.Textbox("MinVolume",minVolume,new {size=5})%>

Sie in diesem Artikel beziehen sich verschiedene Möglichkeiten, um zu sehen, Postbacks in ASP.NET MVC zu behandeln

Link-Text

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top