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