6

フォームがコントローラー アクションに投稿され、フォームがモデルにバインドされると、null 許容の double と decimal の空白のフォーム値はデフォルトで 0 になりますが、null 許容の int の空白のフォーム値はデフォルトで null になります。これは正しいですか?

私のモデルには、空白にすることができるいくつかのフィールドの null 許容型があります。null 許容の int、double、および decimal があります。次に、これらのプロパティごとにテキストボックスを持つ通常のフォームを作成し、デフォルトですべて空白 (空の文字列) に設定します。このフォームがすべて空のフォーム値でコントローラー アクションにポストバックされ、モデルにバインドされると、空の double と decimal が 0 として表示され、空の int が null になります。

空のフォーム値が渡された場合、すべての null 許容型はデフォルトで null になるように思えますが、そうでない場合でも、double と decimal が int とは異なる方法で処理されることは非常に矛盾しているようです。

4

1 に答える 1

5

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

とはいえ、それでも問題が発生し、MVC4 を使用できない場合は、独自のカスタム モデル バインダーを作成して、必要なことを正確に実行してみてください。10 進数の例を次に示します。

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());
于 2014-05-16T13:28:19.677 に答える