Pourquoi ne l'ASP.Net liant de modèle MVC lier un vide tableau JSON à null?
Voici ma classe de modèle:
public class MyModel
{
public Employees[] MyEmpls{get;set;}
public int Id{get;set;}
public OrgName{get;set;}
}
Passage ci-dessous la structure JSON objet avec MyEmpls as empty array
à la MVC du contrôleur.
["Id":12, "MyEmpls":[], "OrgName":"Kekran Mcran"]
Contrôleur
[HttpPost]
public ActionResult SaveOrg(MyModel model)
{
//model.MyEmpls is null here
}
Je suis dans l'attente d' mode.MyEmpls
un vide c# tableau, pas un null. Est un modèle de liaison personnalisé nécessaires pour réaliser un tableau vide?
- Et
MyEmpls
n'est pas nulle lorsque vous fournissez un Employé via JSON? - Pourquoi ne pas u vérifier dans votre méthode d'action si myEmpls est nulle alors le définir comme un vide c# array?
Vous devez vous connecter pour publier un commentaire.
Je pense que certains des autres réponses ont manqué le sens de la question: "pourquoi le défaut MVC modèle de classeur lier un vide tableau Json à la valeur null à la place d'un vide C# array?
Bien, je ne peux pas vous dire pourquoi ils ont fait ça, mais je peux vous montrer où il arrive. La source pour MVC peut être trouvé sur le site CodePlex ici: http://aspnetwebstack.codeplex.com/SourceControl/latest. Le fichier que vous recherchez est ValueProviderResult.cs où vous pouvez voir:
La partie intéressante est le "cas 3":
Vous pouvez passer à côté de cette question par l'initialisation de votre tableau sur le modèle dans son constructeur. Dans ma lecture rapide de la source, je ne peux pas vous dire pourquoi ils ne peuvent pas retourner un tableau vide ou pourquoi ils décident de ne pas le faire, mais il convient de faire de la lecture intéressante.
destinationType.IsArray
retourne la valeur false pourList<>
classe, où il travail pour le type de Tableau.objectList
ne contient rien. Check this out: lostechies.com/jimmybogard/2013/11/07/...Vous obtenez une valeur null comme valeur par défaut pour un type de référence en C#. Afin d'obtenir un tableau vide, vous devez initialiser le tableau dans votre modèle à l'aide d'un constructeur. Cependant, comme vous devez définir la taille du tableau lorsqu'il est initialisé, il pourrait être préférable d'utiliser un autre type de collection comme un
List
:Vous obtiendrez alors une liste vide quand un tableau vide est passé à partir du json.
Si vous devez vraiment utiliser un tableau juste de réagir avec une taille:
MyModel
. Donc je pense qu'il pourrait ne pas avoir le contrôle de modifierEmployee[]
àList<Employee>
Si vous obtenez modèle.MyEmpls nulle, alors vous pouvez créer une condition sur le côté serveur pour arrêter de les élever exception comme:
Et que vous obtenez la valeur null, car votre MyEmpls est une Classe Personnalisée tableau et vous envoyez tout simplement [].
Espère que cela vous aide.
Essayez de créer un modèle de classeur en tant que ci-dessous
Dans Application_Start enregistrer le classeur modèle
Et modifier le contrôleur comme
JavaScriptSerializer désérialise tableaux vides correctement. De sorte que vous pouvez ignorer le passé-dans le modèle et de le reconstruire à partir de la demande d'entrée de flux. Probablement pas la bonne manière, mais si vous ne devez le faire qu'une fois qu'il enregistre un certain effort. Vous aurez besoin de Système de référence.Web.Extensions.
vous pouvez définir un setter qui vérifie si la valeur est null
Le comportement par défaut de C# initialisation de tableau est à null pas de tableau vide
Donc, si vous envoyez un tableau vide, vous ne serez pas initier un tableau vide, mais vous permettra de déclencher l'initialisation par défaut à null
Voir le lien suivant
http://www.dotnetperls.com/null-array
[]
en JSON a été deserialised commenull
il C# plutôt que denew [] {}
. Ce comportement me semble étrange puisque je considère comme un vide C# tableau plus proche d'un tableau JSON quenull
.