2010-09-04 20 views
55

, je recevais une chaîne vide quand il n'y avait pas de valeur:Pourquoi est-ce que j'obtiens une valeur null au lieu d'une chaîne vide lors de la réception d'une requête POST depuis Razor View?

[HttpPost] 
public ActionResult Add(string text) 
{ 
    // text is "" when there's no value provided by user 
} 

Mais maintenant, je passe un modèle

[HttpPost] 
public ActionResult Add(SomeModel Model) 
{ 
    // model.Text is null when there's no value provided by user 
} 

donc je dois utiliser l'opérateur ?? "".

Pourquoi cela se produit-il?

+0

Une solution alternative à l'utilisation des attributs sur chaque propriété du modèle, comme décrit ci-dessous, utilise un classeur de modèle personnalisé, voir http://stackoverflow.com/questions/12734083/string-empty-converted-to-null-when- pass-json-object-to-mvc-controller – Anders

Répondre

118

Vous pouvez utiliser l'attribut DisplayFormat sur la propriété de votre classe de modèle:

[DisplayFormat(ConvertEmptyStringToNull = false)] 
+0

Cela m'a aidé avec la liaison de modèle implicite avant que mon action a été exécutée. Utilisé avec MetadataTypeAttribute pour marquer la propriété auto-générée de Entity Framework Model-First class – EvAlex

+2

Great! Cela devrait être marqué comme la réponse;) – dasheddot

+0

Ceci est définitivement un devrait savoir. – Serge

8

La liaison de modèle par défaut créera un nouveau SomeModel pour vous. La valeur par défaut pour le type de chaîne est null car il s'agit d'un type de référence. Par conséquent, il est défini sur null.

Est-ce un cas d'utilisation de la méthode string.IsNullOrEmpty()?

+1

Oui, c'est ce que je pensais. Je n'ai pas réalisé que la valeur par défaut pour le type de chaîne est null, pas String.Empty si. Non, ce n'est pas le cas pour la méthode IsNullOrEmpty, je n'ai pas de colonnes NULL dans ma table SQL, donc je reçois une exception quand il y a des chaînes nulles. Donc je suppose que je vais devoir continuer à utiliser le ?? "" opérateur. Merci! – Alex

+0

Vous pouvez également utiliser une propriété avec un magasin de sauvegarde et renvoyer string.empty au lieu de null à partir de ViewModel, par exemple: – hackerhasid

+1

woops! voici un peu de psuedocode: private string _text; chaîne publique Texte {get {return _text; } set {_text = valeur ?? string.empty; }} - quelque chose comme ça – hackerhasid

1

J'essaie cette Créer et éditer (mon objet est appelé « entité »): -

 if (ModelState.IsValid) 
     { 
      RemoveStringNull(entity); 
      db.Entity.Add(entity); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(entity); 
    } 

qui appelle ceci: -

private void RemoveStringNull(object entity) 
    { 
     Type type = entity.GetType(); 
     FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.GetField | BindingFlags.Public | BindingFlags.NonPublic); 
     for (int j = 0; j < fieldInfos.Length; j++) 
     { 
      FieldInfo propertyInfo = fieldInfos[j]; 
      if (propertyInfo.FieldType.Name == "String") 
      { 
       object obj = propertyInfo.GetValue(entity); 
       if(obj==null) 
        propertyInfo.SetValue(entity, ""); 
      } 
     } 
    } 

Il sera utile si vous utilisez la base de données d'abord et votre Mod Les attributs sont effacés chaque fois ou d'autres solutions échouent.