Благодаря ответу @Rahul Sharma и @ rhytonix. Они оба хорошо выглядят. Я мог бы sh Я мог принять оба ваших ответа, но я не мог. Мне трудно решить, кто заслуживает получить всю награду, поэтому она должна быть разделена на две равные части.
Поэтому я решила подвести итоги вместе с примерами и более подробными объяснениями.
Почему ?
Это просто потому, что из MVC 2.0
по умолчанию инициализируются строки как ноль. Чтобы быть более точным, если empty
означает, что строка не имеет значения, то. NET устанавливает ее значение по умолчанию. И строка по умолчанию (принадлежащая ссылочному типу): null
.
Подробнее в Привязка свойства строки модели Разрывное изменение
Решение
Есть несколько способов связать свойство String как string.Empty
вместо null
1. Начиная с C# 6, вы можете использовать DefaultValueAttribute , чтобы автоматически определять начальное значение, как показано ниже
public string LastName => string.Empty;
По сути, этот способ аналогичен упомянутому решению OP. в посте, только более элегантно.
2. Пользовательская реализация по умолчанию IModelBinder
путем наследования от DefaultModelBinder
и изменения значения ConvertEmptyStringToNull
на false для внутреннего объекта ModelMetaData
.
public sealed class EmptyStringModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
bindingContext.ModelMetadata.ConvertEmptyStringToNull = false;
return base.BindModel(controllerContext, bindingContext);
}
}
Затем в Application_Start()
метод Global.asax.cs
вам нужно сделать, как показано ниже, чтобы завершить
protected void Application_Start()
{
ModelBinders.Binders.DefaultBinder = new EmptyStringModelBinder();
RegisterRoutes( RouteTable.Routes );
}
3. Используйте DisplayFormatAttribute.ConvertEmptyStringToNull Свойство как показано ниже
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string LastName { get; set; }
Просто потому, что в ModelMetadata
true
если пусто строковые значения автоматически конвертируются в null
; в противном случае false
. По умолчанию true