2013-01-20 5 views
5

フォームがコントローラアクションに投稿され、フォームがモデルにバインドされると、空白の2倍と10倍の空白のフォーム値はデフォルトで0になりますが、nullのintの空白のフォーム値はデフォルトでnullになります。これは正しいですか?モデルのバインド - ヌルの代わりにヌル可能な10進数と倍精度のデフォルト値は0に設定されていますか?

私のモデルには、空白にすることができるいくつかのフィールドのnull可能な型があります。ヌル値int、double、およびdecimalsを持ちます。私はこれらのプロパティのそれぞれにテキストボックスを持っている通常のフォームを持っていて、それらはすべてデフォルトの空白(空文字列)になっています。このフォームがすべての空のフォーム値でコントローラアクションにポストバックされ、それが私のモデルにバインドされると、空の倍精度と小数は0として表示され、空のintはnullになります。

空のフォーム値が渡されたときにnull可能な型はすべてnullにデフォルト設定されているようですが、そうでない場合でも、倍数と小数点はintとは異なる扱いになります。

+0

ジャストオフのチャンスに:あなたは、あなたのモデルをインスタンス化するとき、前にそれにバインドすると、nullable doubleとdecimalsはその時点でどのような値を持っていますか? –

+0

コードを投稿することができれば助かります。 –

答えて

4

この問題は、問題を再現できないため、MVC4で解決されたようです。空のテキストボックスはすべて、nullを私のモデルのnull、int、double、またはdecimalにバインドします。問題ありません。だから問題はどこか他の場所にあるかもしれませんが、これはMVC3のバグだった可能性があり、もはやそれはありません。

しかし、まだ問題が発生していてMVC4を使用できない場合は、独自のカスタムモデルバインダーを作成してください。ここでは、小数点のための一例です:

public class NullableDecimalBinder : IModelBinder { 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
     ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     ModelState modelState = new ModelState { Value = valueResult }; 
     object result = null; 

     if (valueResult.AttemptedValue.Length > 0) { 
      try { 
       // Bonus points: This will bind using the user's current culture. 
       result = Convert.ToDecimal(valueResult.AttemptedValue, System.Globalization.CultureInfo.CurrentCulture); 
      } catch (FormatException e) { 
       modelState.Errors.Add(e); 
      } catch (InvalidOperationException e) { 
       modelState.Errors.Add(e); 
      } 
     } 

     bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
     return result; 
    } 
} 

次に、それを使用するために、あなたのGlobal.asaxのApplication_Startに次の行を追加します

ModelBinders.Binders.Add(typeof(decimal?), new NullableDecimalBinder()); 
関連する問題