6

ASP.Net MVC で非常にイライラすることがわかったのは、デフォルトのモデル バインダーがRequired、空の (文字列または null) 値を null 非許容値型にバインドするときに、単にターゲットをデフォルト値のままにするのではなく、暗黙的に注釈を適用することです。または、少なくともそれをデフォルトの動作にするオプションを提供します。

モデルのターゲット プロパティの型を null 許容値に変更するのが不便なシナリオを考えると、デフォルトのモデル バインダーが空の値を非 null 値にバインドする試みを単純にスキップできるようにするために使用できるコードの最短量はどれくらいですか?値型?をサブクラス化する必要があると想定していますがDefaultModelBinder、目的の動作を実現するために何をオーバーライドする必要があるかわかりません。

例:

<input type="text" name="MyField"/>

値なしで送信:

public ActionResult MyAction(MyModel model)
{
    // do stuff
}

public class MyModel
{
    public int MyField { get; set; }
}

プロパティは、空の値がフォームから投稿されたときに表示されるMyFieldデフォルト値を保持できるようにする必要があります。0

プロパティの型 a を単純に変更できないと仮定しますNullable<int>

4

1 に答える 1

2

このようなものはどうですか?(免責事項:ある程度の信頼性はテストされていません)

public class NonRequiredModelBinder : DefaultModelBinder
{
    protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
    {
        var result = base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
        if (result == null && propertyDescriptor.PropertyType.IsValueType)
            return Activator.CreateInstance(propertyDescriptor.PropertyType);

        return result;
    }
}

理論的にはDefaultModelBinder、プロパティに割り当てられている値を判別し、それがnull値であるかどうかを確認してから、ValueTypeバインドされているのデフォルト値に割り当てるという考え方です。

これにより、バインダーがエラーを追加するのを防ぐことModelStateができますが、それでも次のような他の属性の検証には影響しません。[Range]

これをさらに一歩進めて、独自の属性(つまり、NonRequiredAttribute)を作成することをお勧めします。次に、カスタムモデルバインダーで、プロパティに新しい属性があるかどうかを確認し、新しい属性がある場合にのみNonRequiredこのカスタムコードを実行できます。

于 2012-10-11T16:31:24.610 に答える