web-dev-qa-db-ja.com

Razor ViewからPOSTリクエストを受け取ったときに空の文字列ではなくnullを取得するのはなぜですか?

値がなかったときに空の文字列を受け取っていました。

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

しかし、今私はモデルを渡している

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

したがって、?? ""演算子を使用する必要があります。

なんでこんなことが起こっているの?

69
Alex

モデルクラスのプロパティで DisplayFormat 属性を使用できます。

[DisplayFormat(ConvertEmptyStringToNull = false)]
146
Michael Jubb

デフォルトのモデルバインディングは、新しいSomeModelを作成します。文字列型のデフォルト値は参照型であるためnullであり、nullに設定されています。

これはstring.IsNullOrEmpty()メソッドのユースケースですか?

8
hackerhasid

私は作成と編集でこれを試しています(私のオブジェクトは「エンティティ」と呼ばれます):

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

        return View(entity);
    }

これはこれを呼び出します:-

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

Database Firstを使用し、モデル属性が毎回消去されるか、他のソリューションが失敗する場合に役立ちます。

2
user2284063