0


1

ASP.NET MVC 2数値検証

私はクラスにこのプロパティを持っています:

public virtual decimal? Number { get; set; }

フォームで使用すると、MVCによって自動的に検証されます。 ユーザーが文字を入力すると、当然エラーが返されます。

「値 'D’はNumberに対して無効です。」

このようなエラーメッセージを変更したり、その動作を制御したりするにはどうすればよいですか? 関連する属性などが見つかりません。

ありがとうございました!

2 Answer


0


実際には、モデル検証から派生したメッセージではありません。 モデルバインダーが入力値をバウンドプロパティの値型に変換できない場合、メッセージはモデル状態に追加されます。 これは、たとえば、バインドされたプロパティが整数であり、ユーザーがそのプロパティの入力フィールドに数字以外の文字を入力した場合に発生する可能性があります。

メッセージを上書きするには、残念ながら「ハード」な方法で行う必要があります。 DefaultModelBinderクラスを拡張し、SetPropertyメソッドをオーバーライドします。 これが一例です。

public class MyModelBinder: DefaultModelBinder
{
    public MyModelBinder()
    {
    }

    protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
    {
        string key = bindingContext.ModelName + "." + propertyDescriptor.Name;
        if (bindingContext.ModelState[key] != null)
        {

            foreach (ModelError error in bindingContext.ModelState[key].Errors)
            {
                if (IsFormatException(error.Exception))
                {
                    bindingContext.ModelState[key].Errors.Remove(error);
                    bindingContext.ModelState[key].Errors.Add(string.Format("My message for {0}.", propertyDescriptor.DisplayName));
                    break;
                }
            }
        }
        base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
    }

    private bool IsFormatException(Exception e)
    {
        while (e != null)
        {
            if (e is FormatException)
            {
                return true;
            }
            e = e.InnerException;
        }
        return false;
    }
}


0


範囲バリデータの基礎を与えられた単純な使用と、あなたが望むものを取得します

番号検証では、要件に応じて異なる範囲検証を使用する必要があります。

整数の場合

[Range(0, int.MaxValue, ErrorMessage = "Please enter valid integer Number")]

フロート用

[Range(0, float.MaxValue, ErrorMessage = "Please enter valid float Number")]

ダブル用

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")]