2011-09-20 7 views
11

モデルはASP.Net MVC 3バインド列String.Emptyのようにプロパティの代わりに、ヌルユーザーがRuStringとEnStringの値が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; } 
} 

です。私はnullの代わりにstring.Emptyが必要です。このよう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

あなたは第2の方法を使うことができます! –

+0

MVC 3に空のhtml入力をstring.Emptyとしてバインドする方法を教えてください(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

この作業をするには、 'ModelBinders.Binders.Add(typeof(string)、新しいEmptyStringModelBinder());を' Application_Start() 'に追加する必要があります。私はこの行を追加した後、私のために働いた。 – Manfred

+0

申し訳ありません、私の悪い、彼らはすでに彼らがカスタムバインダーをしようとしていた彼らはこれを行うことを知っていた前提にOPの質問に答えた。他の誰も考えなかった! – Mike

関連する問題