Das funktioniert, aber wie ???Wie erinnert sich asp.net MVC meine falschen Werte auf Postback?
Ich habe eine Controller-Aktion für einen Beitrag:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Person person)
{
bool isvalid = ModelState.IsValid;
etc.
Die Person-Objekt verfügt über eine Eigenschaft Geburtsdatum, Typ Datetime. Wenn ich einige ungültige Daten in das Formular eingeben, sage 'blabla', die offensichtlich kein gültiges Datetime ist, füllt es alle (andere) Person-Eigenschaften mit den richtigen Daten und die BirthDate-Eigenschaft mit einer neuen leeren DateTime. Das Bool isvalid hat den Wert 'false'. So weit so gut.
Dann mache ich das:
return View(p);
und in der Ansicht, ich habe dies:
<%= Html.TextBox("BirthDate", String.Format("{0:g}", Model.BirthDate)) %>
<%= Html.ValidationMessage("BirthDate", "*") %>
Ant dort kommt es: i das Modell erwartet, dass die neue, leere Datetime enthalten, weil ich didn Wenn die Ansicht etwas anzeigt, muss es eine DateTime sein, da Model.BirthDate
nur eine DateTime enthalten kann. Aber zu meiner Überraschung zeigt es eine Textbox mit dem 'blabla' Wert! (und das rote * dahinter)
Was natürlich ist schön, weil der Benutzer sehen kann, was er falsch eingegeben hat, aber wie kann diese (blabla) Zeichenkette in das Feld Ansicht in einem DateTime übertragen werden?
EDIT: Die ModelState Info hat mir hier sehr geholfen. Ich merke auch, dass in MVC 2, wenn Sie Ihre eigene Vorlage für Html.EditorFor() erstellen müssen Sie dieses Verhalten selbst implementieren. Ich habe ein
DateTime.ascx
in dem/views/shared/EditorTemplates Ordner, und dort musste ich prüfen, ob ein Model Fehler für diese Eigenschaft Wert war, und wenn dies der Fall ist, zeige die ungültigen Daten anstelle von die Modelldaten.
So in der Ansicht Ich benutze diese:
<%= Html.LabelFor(model => model.DateOfBirth) %>
und im DateTime.ascx ich benutze diese:
<%
bool invalidData = false;
string propertyName = ViewData.ModelMetadata.PropertyName;
ModelState ms = ViewData.ModelState[propertyName];
if (ms != null)
{
invalidData = ms.Errors.Count > 0;
}
string valueToshow = invalidData ? ViewData.ModelState[propertyName].Value.AttemptedValue : String.Format("{0:g}", Model);
%>
<input class="text-box single-line" id="<%= propertyName %>" name="<%= propertyName %>" type="text" value="<%= valueToshow %>" />
Danke, haben jetzt nicht die Helfer mehr getan, als den Wert im Modell zu analysieren. – Michel