ModelState.IsValid ist false, wenn ich einen Nullable-Parameter habe

8

Ich habe das Problem reproduziert, das ich in einem brandneuen MVC-Web-API-Projekt habe.

Dies ist der Standardcode mit einer leichten Änderung.

%Vor%

Wenn Sie zu http://localhost/api/values/5?something=123 gehen, funktioniert das gut und isValid ist true .

Wenn Sie zu http://localhost/api/values/5?something= gehen, dann ist isValid false .

Das Problem, das ich habe, ist, dass das ModelState.IsValid einen Validierungsfehler mit dem Hinweis "A value is required but was not present in the request."

anzeigt, wenn Sie einen null- oder ausgelassenen Wert für ein Element angeben, für das keine Werte zulässig sind

Das ModelState-Wörterbuch sieht auch so aus:

mit zwei Einträgen für something , eine Nullable, von der ich nicht sicher bin, ob sie signifikant ist oder nicht.

Irgendeine Idee, wie ich das beheben kann, so dass das Modell gültig ist, wenn nullwertfähige Parameter weggelassen oder als null bereitgestellt werden? Ich verwende Modellvalidierung innerhalb meiner Web-API und es bricht es, wenn jede Methode mit einem nullbaren Parameter Modellfehler erzeugt.

    
NibblyPig 30.09.2015, 08:27
quelle

3 Antworten

3

Es scheint, dass das Standardbindungsmodell NULL-Typen nicht vollständig versteht. Wie in der Frage zu sehen ist, gibt es drei Parameterfehler anstelle der erwarteten zwei.

Sie können dies umgehen mit einem benutzerdefinierten NULL-Modellbinder:

Modellbinder

%Vor%

Verwendung

%Vor%

Angepasst von der asp.net Seite: Ссылка für das weitere Lesen und eine alternative Methode, um es auf der Ebene der Klasse (Controller) und nicht pro Parameter einzustellen.

Dies behandelt die drei gültigen Szenarien:

%Vor%

Geben Sie zuerst "etwas" als null an. Alles andere (zB ?something=x ) gibt einen Fehler.

Wenn Sie die Signatur in

ändern %Vor%

(dh = null entfernen), dann müssen Sie den Parameter explizit angeben, dh /test/5 ist keine gültige Route, es sei denn, Sie optimieren auch Ihre Routen.

    
freedomn-m 30.09.2015, 09:26
quelle
0

Entfernen Sie den Standard-Nullwert aus dem zweiten Parameter. Der Modellbinder setzt ihn auf null, wenn es etwas anderes als int ist.

    
Maetis 30.09.2015 08:42
quelle
0

Sie müssen ein benutzerdefiniertes Modellbinder für NULL-Typen registrieren, da der Standardbinder den Validator auch für NULL-fähige Parameter aufruft, wobei letzterer diese leeren Werte als ungültig betrachtet.

Die Modellmappe:

%Vor%

Registrierung:

%Vor%     
haim770 30.09.2015 09:35
quelle