1

私の(ビュー)モデルには、「$123.00」などを示す BillRate フィールドがあります。

    [Display(Name = "Bill Rate")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")]
    public Decimal BillRate { get; set; }

ApplyFormatInEditMode=true のため、これは '$' 記号を示しているため、有効な Decimal ではなく、テキスト ボックスからタブで移動すると (クライアント側の) 検証が失敗します。

独自のカスタムを追加することでこれを回避しますValidationAttribute

    [DecimalSymbols(ErrorMessage = "Invalid currency")]

ここDecimalSymbolsで、記号を取り除き、残りの数字を解析します。

public sealed class DecimalSymbolsAttribute : ValidationAttribute, IClientValidatable
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
         ...
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
         ...
    }
}

これはうまくいくようです。ただし、出力された HTML には、 my属性data-val-numberに加えて、まだ属性があります。data-val-decimalsymbols

<input data-val="true" data-val-decimalsymbols="Invalid currency" data-val-number="The field Bill Rate must be a number." id="BillRate" name="BillRate" type="text" value="$82.80" />

data-val-number「$」によって文字列が数値ではないため、この属性により jQuery 検証が失敗します。この属性はもう必要ありませんが、ASP.NET MVC に指定しないようにするにはどうすればよいですか? EditorFor、TextBoxFor、TextBox を使用してみましたが、関係なく配置されます。ありがとう!

4

1 に答える 1

0

DataFormatString = "{0:c}"前に $ が付いた通貨の値として値が返されます。そのバリデーターをアタッチしないように MVC に指示する 1 つの方法は、独自の拡張メソッドを作成してHtmlString.

ApplyFormatInEditMode = falseまたは、編集モードで文字列に $ を入れないように使用します。

于 2013-10-12T04:03:51.483 に答える