デフォルトのMVCモデルバインダーは、表示用にフォーマットされた値を解析できません。したがって、独自のモデルバインダーを作成し、このタイプに登録する必要があります(タイプ名がFooであるとします)。
public class FooModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var result = bindingContext.ValueProvider.GetValue("Amount");
if (result != null)
{
decimal amount;
if (Decimal.TryParse(result.AttemptedValue, NumberStyles.Currency, null, out amount))
return new Foo { Amount = amount };
bindingContext.ModelState.AddModelError("Amount", "Wrong amount format");
}
return base.BindModel(controllerContext, bindingContext);
}
}
Application_StartでFooタイプのこのバインダーを追加します。
ModelBinders.Binders.Add(typeof(Foo), new FooModelBinder());
ああ、最後に-data-val-number
金額テキストボックスから属性を削除します(そうしないと、数値ではないというメッセージが引き続き表示されます):
$("#Amount").removeAttr("data-val-number");
これで、入力値が正しい通貨額でない場合に検証エラーメッセージが表示されます(例$10F.0
)。
ApplyFormatInEditMode = false
ところで、MVCがカスタム形式の文字列をバインドするのを助けるために、これらすべてのものを実装するよりも使用する方が良いと思います。