web-dev-qa-db-fra.com

Pourquoi est-ce que j'obtiens null au lieu d'une chaîne vide lors de la réception de la requête POST depuis Razor View?

J'avais l'habitude de recevoir une chaîne vide quand il n'y avait pas de valeur:

[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
}

Je dois donc utiliser le ?? "" opérateur.

Pourquoi cela arrive-t-il?

69
Alex

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

[DisplayFormat(ConvertEmptyStringToNull = false)]
146
Michael Jubb

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, il est donc défini sur null.

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

8
hackerhasid

J'essaye ceci dans Create and Edit (mon objet s'appelle 'entité'): -

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

        return View(entity);
    }

Qui appelle ça: -

    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 en premier et que vos attributs de modèle sont effacés à chaque fois, ou si d'autres solutions échouent.

2
user2284063