8

次のモデル クラスがあります (簡単にするために省略しています)。

public class Info
{
    public int IntData { get; set; }
}

このモデルを使用する Razor フォームは次のとおりです。

@model Info
@Html.ValidationSummary()
@using (Html.BeginForm())
{
    @Html.TextBoxFor(x => x.IntData)
    <input type="submit" />
}

テキスト ボックスに数値以外のデータを入力すると、正しい検証メッセージが表示されます。つまり、「値 'qqqqq' はフィールド 'IntData' に対して有効ではありません」。

しかし、非常に長い一連の数字 (345234775637544 など) を入力すると、EMPTY 検証サマリーが表示されます。

私のコントローラー コードでは、これModelState.IsValidfalse予想どおりでありModelState["IntData"].Errors[0]、次のようになっています。

{System.Web.Mvc.ModelError}
ErrorMessage: ""
Exception: {"The parameter conversion from type 'System.String' to type 'System.Int32' failed. See the inner exception for more information."}

(exception itself) [System.InvalidOperationException]: {"The parameter conversion from type 'System.String' to type 'System.Int32' failed. See the inner exception for more information."}
InnerException: {"345234775637544 is not a valid value for Int32."}

ご覧のとおり、検証は正常に機能しますが、ユーザーにエラー メッセージは表示されません。

この場合、適切なエラー メッセージが表示されるように、既定のモデル バインダーの動作を微調整できますか? または、カスタム バインダーを作成する必要がありますか?

4

2 に答える 2

8

1 つの方法は、カスタム モデル バインダーを作成することです。

public class IntModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value != null)
        {
            int temp;
            if (!int.TryParse(value.AttemptedValue, out temp))
            {
                bindingContext.ModelState.AddModelError(bindingContext.ModelName, string.Format("The value '{0}' is not valid for {1}.", value.AttemptedValue, bindingContext.ModelName));
                bindingContext.ModelState.SetModelValue(bindingContext.ModelName, value);
            }
            return temp;
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

に登録できますApplication_Start

ModelBinders.Binders.Add(typeof(int), new IntModelBinder());
于 2011-06-09T08:58:01.317 に答える
1

入力フィールドの MaxLength を 10 程度に設定してみてはどうでしょうか。IntData に範囲を設定することと組み合わせてそれを行います。もちろん、ユーザーが 345234775637544 を入力できるようにしたい場合を除きます。その場合は、文字列を使用したほうがよいでしょう。

于 2011-06-10T02:30:03.177 に答える