2011-09-20 17 views
11

模型是ASP.Net MVC 3綁定字符串屬性作爲的String.Empty代替空

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

沒有幫助。

回答

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

如果我們不想將每個字符串字段標記爲'[DisplayFormat(ConvertEmptyStringToNull = false)]''怎麼辦? – AlexBBB

+1

你可以用第二種方式! –

+0

問題是如何告訴MVC 3將空html輸入綁定爲string.Empty,而不是null(就像在MVC 1中一樣)。 BilingualString就是一個例子,表明自定義的EmptyStringModelBinder不會這麼做。 – AlexBBB

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()方法

+1

爲了做到這一點,您還需要在Application_Start()中添加'ModelBinders.Binders.Add(typeof(string),new EmptyStringModelBinder());'。在我添加這行後,它也適用於我。 – Manfred

+0

對不起,我的不好,我回答了OP的問題,假設他們知道這樣做,因爲他們已經嘗試了一個自定義綁定。沒有想到其他人! – Mike

相關問題