2010-09-04 9 views
55

que utiliza para recibir cadena vacía cuando no había ningún valor:¿Por qué obtengo un valor nulo en lugar de cadena vacía cuando recibo una solicitud POST desde Razor View?

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

pero ahora estoy pasando un modelo

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

así que tengo que utilizar el operador ?? "".

¿Por qué sucede esto?

+0

Una solución alternativa al uso de atributos en cada propiedad del modelo, como se describe a continuación, es usar un encuadernador de modelo personalizado, ver http://stackoverflow.com/questions/12734083/string-empty-converted-to-null-when- passing-json-object-to-mvc-controller – Anders

Respuesta

118

Usted puede utilizar el atributo DisplayFormat en la propiedad de la clase del modelo:

[DisplayFormat(ConvertEmptyStringToNull = false)] 
+0

Esto me ayudó con el enlace de modelo implícito antes de que se ejecutara mi acción. Lo usé junto con MetadataTypeAttribute para marcar la propiedad autogenerada de Entity Framework Model-First class – EvAlex

+2

¡Genial! Esto debe marcarse como la respuesta;) – dasheddot

+0

Esto es definitivamente un Debería saber. – Serge

8

El enlace de modelo predeterminado creará un nuevo modelo para usted. El valor predeterminado para el tipo de cadena es nulo, ya que es un tipo de referencia, por lo que se establece en nulo.

¿Es este un caso de uso para el método string.IsNullOrEmpty()?

+1

Sí, eso es lo que pensé. No me di cuenta de que el valor predeterminado para el tipo de cadena es nulo, pero no String.Empty. No, no es el caso para el método IsNullOrEmpty, no tengo columnas NULL en mi tabla SQL, así que recibo una excepción cuando hay cadenas nulas. Así que supongo que tendré que seguir usando el ?? "" operador. ¡Gracias! – Alex

+0

También puede utilizar una propiedad con una tienda de respaldo y devolver string.empty en lugar de nulo desde ViewModel, por ejemplo: – hackerhasid

+1

¡woops! aquí hay algunos psuedocode: private string _text; public string Text {get {return _text; } set {_text = value ?? string.empty; }} - algo así como – hackerhasid

1

Estoy tratando esto en crear y editar (mi objeto se llama 'entidad'): -

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

     return View(entity); 
    } 

¿Qué le llama a esto: -

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, ""); 
      } 
     } 
    } 

será útil si se utiliza la base de datos primero y el Mod los atributos se eliminan cada vez u otras soluciones fallan.

Cuestiones relacionadas