Zastanawiałem się, jak mogę uzyskać walidację modelu za pomocą ASP.NET Web API. Mam taki model:
public class Enquiry
{
[Key]
public int EnquiryId { get; set; }
[Required]
public DateTime EnquiryDate { get; set; }
[Required]
public string CustomerAccountNumber { get; set; }
[Required]
public string ContactName { get; set; }
}
Następnie mam akcję Opublikuj w moim kontrolerze API:
public void Post(Enquiry enquiry)
{
enquiry.EnquiryDate = DateTime.Now;
context.DaybookEnquiries.Add(enquiry);
context.SaveChanges();
}
Jak dodać, if(ModelState.IsValid)
a następnie obsłużyć komunikat o błędzie, który ma zostać przekazany użytkownikowi?
c#
asp.net-web-api
CallumVass
źródło
źródło
System.Net.Http
,System.Net
System.Web.Http.Controllers
iSystem.Web.Http.Filters
.IncludeErrorDetailPolicy.Always
spowoduje uwzględnienie szczegółów (z ryzykiem ujawnienia szczegółów użytkownikom)Może nie tego, czego szukałeś, ale może miło, żeby ktoś wiedział:
Jeśli używasz .net Web Api 2, możesz po prostu wykonać następujące czynności:
W zależności od błędów modelu otrzymasz taki wynik:
źródło
W ten sposób na przykład:
To zwróci następującą odpowiedź (zakładając JSON, ale ta sama podstawowa zasada dla XML):
Możesz oczywiście skonstruować swój obiekt / listę błędów w dowolny sposób, na przykład dodając nazwy pól, identyfikatory pól itp.
Nawet jeśli jest to „jednokierunkowe” wywołanie Ajax, takie jak POST nowej jednostki, nadal powinieneś zwrócić coś do dzwoniącego - coś, co wskazuje, czy żądanie się powiodło. Wyobraź sobie witrynę, w której użytkownik doda informacje o sobie za pośrednictwem żądania AJAX POST. Co się stanie, jeśli informacje, które próbowali wprowadzić, są nieprawidłowe - skąd będą wiedzieć, czy ich akcja zapisywania zakończyła się powodzeniem, czy nie?
Najlepszym sposobem na to jest użycie dobrych starych kodów stanu HTTP, takich jak
200 OK
i tak dalej. W ten sposób Twój JavaScript może poprawnie obsługiwać awarie przy użyciu poprawnych wywołań zwrotnych (błąd, sukces itp.).Oto fajny samouczek dotyczący bardziej zaawansowanej wersji tej metody, wykorzystującej ActionFilter i jQuery: http://asp.net/web-api/videos/getting-started/custom-validation
źródło
enquiry
obiekt, ale nie mówi, które właściwości są nieprawidłowe? Więc jeśli zostawiłemCustomerAccountNumber
puste, powinien on zawierać domyślny komunikat walidacji (pole CusomterAccountNumber jest wymagane ..)errors.Add(error.ErrorMessage);
na,errors.Add(error.Exception.Message);
żeby to działało dla mnie.Możesz użyć atrybutów z
System.ComponentModel.DataAnnotations
przestrzeni nazw, aby ustawić reguły walidacji. Szczegółowe informacje można znaleźć w sekcji Walidacja modelu - autor: Mike Wasson .Zobacz także wideo ASP.NET Web API, część 5: Custom Validation - Jon Galloway
Inne referencje
źródło
Lub, jeśli szukasz prostego zbioru błędów dla swoich aplikacji ... oto moja implementacja tego:
Odpowiedź na komunikat o błędzie będzie wyglądać następująco:
źródło
Dodaj poniższy kod w pliku startup.cs
źródło
Tutaj możesz sprawdzić, czy jeden po drugim wyświetla się błąd stanu modelu
}
źródło
DO#
...
Javascript
źródło
Miałem problem z implementacją zaakceptowanego wzorca rozwiązania, w którym
ModelStateFilter
zawsze zwracałemfalse
(a następnie 400)actionContext.ModelState.IsValid
dla niektórych obiektów modelu:Akceptuję tylko JSON, więc zaimplementowałem niestandardową klasę segregatora modelu:
Które rejestruję się bezpośrednio po moim modelu przez
źródło
Możesz także zgłosić wyjątki, zgodnie z dokumentacją tutaj: http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx
Uwaga, aby zrobić to, co sugeruje ten artykuł, pamiętaj o dołączeniu System.Net.Http
źródło