ASP.Net MVC 3 связывает строковое свойство как string.Empty вместо null - PullRequest
11 голосов
/ 20 сентября 2011

модель -

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

не помогает.

Ответы [ 2 ]

15 голосов
/ 21 сентября 2011

Используйте это:

    [DisplayFormat(ConvertEmptyStringToNull=false)]
    public string RuString { get; set; }

OR

    private string _RuString;
    public string RuString {
        get {
            return this._RuString ?? "";
        }
        set {
            this._RuString = value ?? "";
        }
    }
2 голосов
/ 01 августа 2014

старый вопрос, но в любом случае вот ответ:)

Кажется, проблема в том, что 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...