Warum hat die ASP.Net MVC-model-binder binden ein leeres JSON-array auf null?
Hier ist meine model-Klasse:
public class MyModel
{
public Employees[] MyEmpls{get;set;}
public int Id{get;set;}
public OrgName{get;set;}
}
Vorbei an der unterhalb der JSON-Struktur-Objekt mit MyEmpls as empty array
zu MVC-controller.
["Id":12, "MyEmpls":[], "OrgName":"Kekran Mcran"]
Controller
[HttpPost]
public ActionResult SaveOrg(MyModel model)
{
//model.MyEmpls is null here
}
Ich erwarte mode.MyEmpls
eine leere c# - array nicht null ist. Ist ein custom-Modell binder notwendig, um ein leeres array?
- Und
MyEmpls
ist nicht null, wenn Sie einen Mitarbeiter über JSON? - Warum nicht u prüfen Sie in Ihrem action-Methode, wenn myEmpls null ist, dann definieren Sie diese als eine leere c# - array?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass einige der anderen Antworten übersehen haben, die die Bedeutung der Frage: warum ist das Standard-MVC-Modell-binder binden ein leeres Json-array auf null, anstatt eine leere C# - array?
Gut, ich kann nicht sagen, warum Sie das getan hat, aber ich kann Ihnen zeigen, wo es passiert. Die Quelle für MVC finden sich auf CodePlex hier: http://aspnetwebstack.codeplex.com/SourceControl/latest. Die Datei, die Sie suchen, ist ValueProviderResult.cs, wo Sie sehen können:
Der interessante Teil ist, "Fall 3":
Können Sie umgehen dieses Problem, indem die Initialisierung der Arrays auf das Modell in seinem Konstruktor. In meinem schnellen Lesen der Quelle kann ich nicht sagen warum Sie nicht mehr zurück können, ein leeres array, oder warum Sie nicht entscheiden, aber es sollte für eine interessante Lektüre.
destinationType.IsArray
gibt false zurück, fürList<>
Klasse, wo es Arbeit für Array-Typ.objectList
nichts enthält. Check this out: lostechies.com/jimmybogard/2013/11/07/...Erhalten Sie einen null-Wert, da dies der default-Wert für eine Referenz-Typ in C#. Um ein leeres array, das Sie benötigen, initialisieren Sie das array in Ihrem Modell mit einem Konstruktor. Jedoch als Sie müssen definieren Sie die Größe des Arrays, wenn es initialisiert wird könnte es besser sein, mit einer anderen Art von Sammlung wie ein
List
:Erhalten Sie dann eine leere Liste, wenn ein leeres array übergeben wird von der json.
Wenn Sie wirklich haben, um ein array zu verwenden, nur initialisieren Sie es mit einer Größe:
MyModel
. Also ich glaube, er könnte nicht die Kontrolle zu ändernEmployee[]
zuList<Employee>
Wenn Sie sind immer Modell.MyEmpls als null, dann können Sie eine Bedingung erstellen, die auf server-Seite zu stoppen, heben Ausnahme wie:
Und Sie bekommen es null, weil Ihre MyEmpls ist eine Benutzerdefinierte Klasse array und Sie senden Sie einfach [].
Hoffe, dies hilft Ihnen.
Versuchen ein Modell zu erstellen, binder, wie in der unten
In der Application_Start-register der Sammelmappe Modell
Und ändern Sie die controller als
JavaScriptSerializer deserialisiert leeren Felder richtig. So können Sie ignorieren die übergebene Modell und erstellen Sie ihn neu aus dem Eingabe-request stream. Wahrscheinlich nicht der richtige Weg, aber wenn Sie müssen es nur tun, wenn es einmal spart einigen Aufwand. Sie müssen Referenz-System.Web.Extensions.
können Sie definieren, ein setter, der prüft, ob der Wert null ist
Das Standard-Verhalten von C# - array-Initialisierung auf null nicht leeres array
So, wenn Sie senden Sie ein leeres array, das Sie nicht einleiten, ein leeres array ist, aber Sie löst die default-Initialisierung auf null
Finden Sie unter dem folgenden link
http://www.dotnetperls.com/null-array
[]
im JSON-war deserialised alsnull
es C# eher alsnew [] {}
. Dieses Verhalten scheint mir seltsam da sehe ich eine leere C# - array, um näher an ein JSON array alsnull
.