ASP.Net MVC 3将字符串属性绑定为string.Empty而不是null

时间:2011-09-20 18:50:58

标签: asp.net-mvc-3

模型是

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的值为null。我需要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 个答案:

答案 0 :(得分:15)

使用此:

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

OR

    private string _RuString;
    public string RuString {
        get {
            return this._RuString ?? "";
        }
        set {
            this._RuString = value ?? "";
        }
    }

答案 1 :(得分: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());

在Global.asax.cs的Application_Start()方法中