Wenn ich ein einfaches Modell wie folgt aus:Wie wird ein Wert geändert, der an eine MVC-Aktionsmethode gerundet wird?
Modell:
public class AnimalModel {
public string Species {get;set;}
}
Ausblick:
<%= Html.TextBox("Species") %>
ActionMethod (POST):
AnimalModel model = new AnimalModel();
// update model
UpdateModel(model); // updates ViewData.ModeState
// correct spelling
if (model.Species == "catt") {
model.Species = "cat";
}
// return view
return View(model);
Also die Aktionsmethode auf einem POST soll die Schreibweise von "catt" zu "cat" korrigieren.
Das Problem ist, dass der Quelltext für 'TextBox' den Wert von ViewData.ModelState nimmt, wenn dort ein 'Species' Wert gefunden wird. Dies bedeutet, dass mein korrekter Wert für ein Postback nicht aktualisiert wird, da 'catt' Priorität hat. So
dachte ich - ah gut, ich werde einfach es so explizit machen:
<%= Html.TextBox("Species", Model.Species) %>
Überraschenderweise dies nicht funktioniert und STILL nimmt den Wert von ViewData.ModelState. Ich bin mir ziemlich sicher, dass dies ein Fehler in MVC ist, da ich den Quellcode für diese Überladung sehe, finde ich diese Überlastung. Es zeigt deutlich, dass die ‚useViewData‘ Parameter falsch sein soll, wenn ‚Wert‘ zur Verfügung gestellt wird (was ich mache ausdrücklich oben):
public static string TextBox(this HtmlHelper htmlHelper, string name, object value, IDictionary<string, object> htmlAttributes) {
return InputHelper(htmlHelper, InputType.Text, name, value,
(value == null) /* useViewData */, false /* isChecked */, true /* setId */, true /* isExplicitValue */, htmlAttributes);
}
Unfortunatley obwohl der ‚InputHelper‘ Methode respektiert diese Eigenschaft nicht für eine TextBox und schaut immer noch zuerst im ViewDataDictionary. Es findet "catt" in diesem Wörterbuch, weil es direkt von den POST-Daten kam.
Ich habe eine Lösung gefunden, wenn ein UserControl verwendet wird, das NULL für ViewDataDictionary übergibt.
<% Html.RenderPartial("AnimalControl", Model, null); %>
Was ist die Lösung dafür? Ich bin mir sicher, dass das irgendwo dokumentiert ist, aber ich kann es nicht finden. Ich möchte ViewDataDictionary nicht manuell löschen müssen, aber ich sehe keine andere Lösung.
ich entweder. Ich habe gerade ein paar Stunden damit verbracht, an etwas Komplizierterem zu arbeiten. Schließlich stellte sich heraus, dass es so etwas wie ein niedriges Niveau war. sehr frustrierend! –