ASP.Net MVC 3 связывает свойство строки как string.Empty вместо null
модель
public partial class BilingualString
{
public string RuString { get; set; }
public string EnString { get; set; }
}
public partial class Member
{
public Member()
{
this.DisplayName = new BilingualString();
}
public BilingualString DisplayName { get; set; }
}
Если пользователь не заполняет ввод, значения RuString и EnString равны нулю. Мне нужен string.Empty вместо null.
Использование CustomModelBinder следующим образом:
public class EmptyStringModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
bindingContext.ModelMetadata.ConvertEmptyStringToNull = false;
return base.BindModel(controllerContext, bindingContext);
}
}
не помогите.
Ответы
Ответ 1
Используйте это:
[DisplayFormat(ConvertEmptyStringToNull=false)]
public string RuString { get; set; }
ИЛИ
private string _RuString;
public string RuString {
get {
return this._RuString ?? "";
}
set {
this._RuString = value ?? "";
}
}
Ответ 2
старый вопрос, но вот ответ в любом случае:)
Проблема заключается в том, что ConvertEmptyStringToNull задан в контексте привязки модели, а не в контексте связывания свойств.
Внутри DefaultModelBinder он вызывает BindProperty для каждого свойства модели и не перезаписывает простые объекты, такие как строки/десятичные знаки, до их собственного вызова BindModel.
К счастью, мы можем переопределить GetPropertyValue и установить параметр в контексте.
public class EmptyStringModelBinder : DefaultModelBinder
{
protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
{
bindingContext.ModelMetadata.ConvertEmptyStringToNull = false;
return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
}
}
Работал для меня:)
[править]
Как указано в комментариях. Это связующее устройство будет работать только, если оно зарегистрировано, поэтому после добавления класса обязательно вызовите
ModelBinders.Binders.Add(typeof(string), new EmptyStringModelBinder());
в методе Application_Start() для Global.asax.cs