9

通貨フィールドのWebページでエラー(「フィールド金額は数値である必要があります」)が表示されます。ドル記号($ 50.00)が原因です。

[DataType(DataType.Currency)]
[DisplayFormat(DataFormatString = "{0:c}", ApplyFormatInEditMode = true)]
public decimal Amount { get; set; }

@Html.EditorFor(model => model.Amount)

ドル記号を保持したい場合、他に何をする必要がありますか?

4

3 に答える 3

8

デフォルトの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がカスタム形式の文字列をバインドするのを助けるために、これらすべてのものを実装するよりも使用する方が良いと思います。

于 2013-01-22T21:37:28.093 に答える
0

System.ComponentModel.DataAnnotations.RegularExpressionAttributeを使用できます。

于 2013-01-25T22:23:15.857 に答える
0

編集モードをfalseに設定することもできます。次に、テキストがフォーマットされている間、10進値のみが表示されます。

ApplyFormatInEditMode = false
于 2014-05-08T20:40:00.073 に答える