Mam problem pojawiający się w formularzu, który próbuję opublikować. W scenariuszu, w którym formularz się nie sprawdza, wybieram standardową trasę wywoływania ModelState.AddModelError()
, a następnie zwracam wynik widoku.ASP.Net MVC ModelState/Html.TextBox - problem z odpracowaniem
Chodzi o to, że HTML. * Helpery mają pobierać zaksięgowaną wartość podczas renderowania i zauważam, że moje pola tekstowe robią to TYLKO, jeśli umieściłem je na liście parametrów działania oddzwonienia, które powinno Wymagane jest widzenie, ponieważ niektóre formularze mają zdecydowanie za dużo pól, aby je wszystkie wymienić jako parametry.
Mój kod działanie jest grubsza:
[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);
}
}
Teraz dataDefinition (co jest LINQ do podmiotu SQL) ma pole MinVolume, jest obsługiwane w widoku od tej linii:
Minimum: <%= Html.TextBox("MinVolume", null, new { size = 5 })%>
Jednak gdy widok jest renderowany po nieudanym sprawdzaniu poprawności ModelState, wartość zapisana w nim na oryginalnej stronie, którą zamieściliśmy, nie jest zachowywana, O ile nie uwzględnię jej jako parametru w metodzie odświeżenia. Dosłownie, mogę "rozwiązać problem", wykonując to:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name, string minVolume)
Z jakiegoś powodu, które wymusi zachowanie wartości pola. Wydaje mi się to głupie, ponieważ moja forma ma znacznie więcej wartości niż tylko to i nie powinienem dodawać parametru dla tego pola.
Wszelkie pomysły?
Nie, podając wartość null należy określić, że istniejący kontekst modelu powinien być użyty do wysłania zapytania o wartość. Określenie MinVolume jest wyraźne i zmusiłoby tę wartość do użycia zamiast tego, co zostało wcześniej przesłane. –
Niepoprawnie. Określenie MinVolume wyszukuje ViewDataDoctionary, a następnie ModelStateDictionary dla kolejnych postów. Więc jeśli Model.MinVolume powie 5 edycji, to określenie MinVolume umieści 5 w TextBox. Następnie, jeśli zostanie utworzony post (powiedzmy, że wartość 3), ale zostanie uznany za nieprawidłowy, wówczas TextBox pokaże 3 po raz drugi. Próbowałeś tego? Zazwyczaj określa się wartość NULL w widoku "Nowy" lub "Utwórz", aby początkowy wpis był pusty w polu, a kolejne posty utrzymywały wprowadzoną wartość. –
To jest dokładnie ten sam sposób, w jaki to robię i działa za każdym razem. Nigdy nie widziałem nigdzie, że trzeba określić zero. Link do tego, gdzie widziałeś, byłby dobry. – sirrocco