To działa, ale jak?Jak asp.net MVC zapamiętuje moje nieprawidłowe wartości na poczcie zwrotnej?
Mam działania kontrolera na stanowisko:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Person person)
{
bool isvalid = ModelState.IsValid;
etc.
Przedmiotem osoba ma urodzenia rzeczowych typu DateTime. Po wprowadzeniu niektórych nieprawidłowych danych w formularzu, powiedz "blabla", co jest oczywiste, nie jest prawidłową datą, wypełnia on wszystkie właściwości (inne) osoby poprawnymi danymi i właściwością BirthDate z nową pustą datą. Wartość bool jest nieprawidłowa ma wartość "false". Jak dotąd tak dobrze.
Wtedy to zrobić:
return View(p);
iw widoku mam to:
<%= Html.TextBox("BirthDate", String.Format("{0:g}", Model.BirthDate)) %>
<%= Html.ValidationMessage("BirthDate", "*") %>
Ant tam chodzi: Spodziewałem model zawiera nową, pustą DateTime bo nie zrobił Nie dodawaj żadnych nowych danych. Po drugie, gdy widok wyświetla coś, musi to być DateTime, ponieważ Model.BirthDate
nie może pomieścić niczego innego niż DateTime. Ale ku mojemu zdziwieniu pokazuje pole tekstowe z wartością "blabla"! (i czerwony * za nim)
Który z nich jest przyjemny, ponieważ użytkownik widzi, co wpisał błędnie, ale w jaki sposób ten ciąg (blabla) może zostać przeniesiony do pola Widok w polu DataTime?
EDIT: Informacje o ModelState bardzo mi pomogły. Też zauważyłem, że w MVC 2, że kiedy tworzysz swój własny Szablon dla Html.EditorFor() musisz sam zaimplementować to zachowanie. stworzyłem
DateTime.ascx
w widokach/udostępnionego folderu// EditorTemplates i tam miałem, by sprawdzić, czy nie było błędów ModelState dla tej wartości nieruchomości, a jeśli tak, to pokazują nieprawidłowe dane w zastępstwie dane modelu.
Więc w widoku używać to:
<%= Html.LabelFor(model => model.DateOfBirth) %>
aw DateTime.ascx używam to:
<%
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 %>" />
Dzięki, nie teraz pomocnicy zrobili więcej niż analizowanie wartości w modelu. – Michel