Yo solía recibir cadena vacía cuando no hay valor:

[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 usar el ?? "" operador.

Por qué está sucediendo esto?

  • Una solución alternativa a usar los atributos de cada modelo de propiedad, como se describe a continuación, es el uso de un cuaderno de modelo personalizado, consulte stackoverflow.com/questions/12734083/…
InformationsquelleAutor Alex | 2010-09-04

3 Comentarios

  1. 147

    Puede utilizar el DisplayFormat atributo en la propiedad de su modelo clase:

    [DisplayFormat(ConvertEmptyStringToNull = false)]
    • Esto me ayudó con el modelo implícito de unión antes de que mi acción fue ejecutada. Utilizado junto con MetadataTypeAttribute para marcar auto-generado propiedad de Modelo de Entity Framework-Primera clase
    • Genial!!! Este debe ser marcado como la respuesta 😉
    • Esta es definitivamente una Debe Saber.
    • Esto no parece trabajar con MVC 5.2.2.
    • Yo estoy usando: public ActionResult Quotations(string projectName, string brandName, string modelName, string clientName) { var model = _dataAccess.Quotations_Select(projectName, brandName, modelName, clientName); return View(model); } llamar a un procedimiento almacenado y el suministro de valores, por lo que, el atributo no va a funcionar para mí. ¿Qué debo hacer?
    • Es un largo camino, pero también, en MVC6, si (como yo) que por alguna razón no desea que este a través de un atributo y desea almacenar los metadatos en otro lugar, usted puede escribir su propio proveedor de los metadatos y registrarlo en el Inicio.cs como: AddMvc(o => ModelMetadataDetailsProviders.Add(new YourProvider())). Hay en GetDisplayMetadata que usted puede hacer everying que los atributos que hacer. Para esta pregunta es que va a ser context.DisplayMetadata.ConvertEmptyStringToNull = false;
    • Esto chocaba con mi otra validación que tenía en la propiedad. Terminé la creación de una propiedad con un campo de respaldo donde se devuelve cadena vacía si la copia de campo es nulo.

  2. 8

    El modelo predeterminado de unión creará un nuevo SomeModel para usted. El valor predeterminado para el tipo de cadena es nula, ya que es un tipo de referencia, por lo que se establece en null.

    Es este un caso de uso para la cadena.IsNullOrEmpty() método?

    • Sí, eso es lo que yo pensaba. Yo no me di cuenta que el valor predeterminado para el tipo de cadena es nula, no de la Cadena.Vacío, aunque. No, no es el caso para la IsNullOrEmpty método, NO he NULL columnas en mi tabla de SQL, por lo que obtener una excepción cuando no’are cadenas nulas. Así que supongo que voy a tener que continuar el uso de el ?? «operador». Gracias!
    • También puede utilizar una propiedad con un almacén de respaldo y devuelve la cadena.vacío en lugar de null, desde la Perspective, por ejemplo:
    • woops! he aquí algunos psuedocode: private string _textos; public string Text { get { return _textos; } set { _textos = valor ?? de la cadena.vacío; }}; algo así como que
  3. 2

    Estoy intentando esto de Crear y Editar (mi objeto es llamado «entidad»): –

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

    Que llama a este:-

        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 utiliza una Base de datos Primero y su Modelo de atributos obtener aniquilada cada momento, o de otras soluciones de fallar.

Dejar respuesta

Please enter your comment!
Please enter your name here