Pytanie ASP.NET MVC: ModelState vs. ModelStateDictionary


Mam usługę, która ma metodę, która jest wywoływana, gdy wyzwalana jest określona metoda kontrolera.

Moja usługa zwraca niestandardowy obiekt wyniku PlacementResult w którym chcę przekazać błędy, które mogły się wydarzyć (sprawdzanie poprawności) z powrotem do metody kontrolera.

Powinien PlacementResult mieć modelState lub ModelStateDictionary, aby przekazywać błędy z powrotem do kontrolera (i na koniec przeglądać)? Jak mam napisać to razem?

Na koniec, w jaki sposób uzyskać ModelState / ModelStateDictionary (cokolwiek powinieneś powiedzieć, że powinienem wybrać) z powrotem do widoku (podświetlić odpowiednie pole tekstowe, pokazać komunikat o błędzie itp.)?

Dziękuję Ci !


12
2017-08-18 05:06


pochodzenie




Odpowiedzi:


To jest dobre łącze, które pokazuje, w jaki sposób usługa może przeprowadzić walidację i przekazać wynik do kontrolera:

http://www.asp.net/mvc/tutorials/validating-with-a-service-layer-cs (naprawiony link)


3
2017-08-31 05:23





Nie, nie chcesz dodawać ModelStateDictionary do swojego typu wyniku. Istnieje już ModelStateDictionary na kontrolerze (we właściwości ModelState). Nie jest właściwe, aby wyniki ustawiały stan modelu kontrolera. Powinno to zostać zrobione podczas wiązania lub w ramach samego działania kontrolera. Jeśli chcesz, użyj niestandardowego segregatora modelu.

Twój wybrany może zobaczyć błędy stanu modelu poprzez zbadanie właściwości ViewData.ModelState kontrolera.


2
2017-08-18 13:45



W jaki sposób mogę jednak zatwierdzić moją usługę i przekazać jej wynik do kontrolera? Przykład MVC był zbyt dezorientujący (jest taki na stronie asp.net/mvc, ale go nie rozumiałem) - Alex
Czy możesz poczekać na następny podgląd MVC 2? Myślę, że zamierzają wprowadzić bardziej solidne ramy walidacji. W MVC 1 można wdrożyć IDataErrorInfo, aw podgląd 1 MVC 2 można użyć System.ComponentModel.DataAnnotations. - Craig Stuntz
Kiedy to wyjdzie? - Alex
Moje dzikie domysły dotyczą .NET 4. Ale to tylko domysły. Nie jestem w drużynie. Następny podgląd (wkrótce) ma usunąć ograniczenie uruchamiania i działa już na 3,5 SP 1. - Craig Stuntz
"Nie jest właściwe, aby wyniki ustawiały stan modelu kontrolera." IMHO można dodać błędy sprawdzania poprawności modelu pochodzące z wywołania usługi do ModelState. więc możesz scalić błędy przychodzące z twoich usług do ModelState. - SDReyes


Twój wynik rozmieszczenia powinien zwrócić obiekt słownika lub listę, którą powinieneś scalić ze stanem modelu na początku każdej akcji.

Jeśli przejdziesz przez ciebie, zauważysz, że słownik stanu modelu kontrolerów zawiera wszystkie twoje pola wejściowe, ich wartości i błędy z nimi związane. Chcesz scalić błędy dotyczące rozmieszczania wyników ze słownika stanu modelu przy użyciu odpowiednich kluczy. W ten sposób silnik widoku wie, które pola mają być oznaczone jako nieważne.

ModelState.Merge(PlacementResult);
if(ModelState.IsValid)
{
    ...
}

1
2018-03-28 23:28





Nie wiem, jak wygląda Twój wynik w PlacementResult, sprawdź, czy możesz go wykorzystać w swoim widoku:

ModelState.AddModelError(ErroredProperty, ErrorMessage);

Upewnij się, że zwracasz obiekt, który nie powrócił z powrotem do widoku

return View(myObjectInstance);

0
2017-08-18 05:11





Na podstawie SoC myślę, że powinieneś zwrócić błędy ze swoich usług i połączyć je w swoim ModelState w razie potrzeby.

Ale naszym celem jest utrzymanie oddzielenia, a także użycie metody ModelState.Merge (). nie jest?

Tam jest konkretna realizacja to mogłoby pomóc


0
2018-02-10 23:02





Możesz przekazać kontroler do swojej metody, ponieważ klasa Controller zawiera właściwość ModelState. W swojej metodzie możesz wykonać następujące czynności:

private PlacementResult BuildResult(Controller controller)
{
   controller.ModelState.AddModelError(propertyName, errorMessage);
}

W twoim działaniu ...

BuildResult(this);
if(ModelState.IsValid) {...

0
2018-02-28 06:54