模型是
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);
}
}
没有帮助。
答案 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()方法中