Ненавязчивый MVC3 data-val-number проверки JQuery - PullRequest
3 голосов
/ 13 марта 2012

Действительно борется со встроенной ненавязчивой проверкой jquery, установленной MVC3.

Мой объект имеет свойство, такое как:

    [DisplayName("GP")]
    [DataType(DataType.Currency)]
    [DisplayFormat(NullDisplayText = "$0", DataFormatString = "{0:C0}", ApplyFormatInEditMode = true)]
    [Column("gross_profit")]
    public decimal? GrossProfit { get; set; }

EditorFor создает текстовое поле, что хорошоОднако проверка не проходит, потому что я хочу, чтобы пользователи могли вводить префиксы валют ... например, 48 000 долларов США. Проверка на стороне клиента завершается неудачно, говоря, что свойство не является числом.

У меня нет проблем с написанием моегособственные аннотации данных и привязка пользовательской модели для этого, но я не могу понять, как помешать MVC автоматически вставить это «data-val-number» в текстовый ввод только потому, что он имеет тип decimal.

Я полагаю, что «data-val-number» мешает JQuery ненавязчивой проверке пройти, потому что поле ввода содержит знак доллара и, возможно, запятую.

Так что я не ищу каких-либо советов по глобализации, а скорее способа, позволяющего пользователю вводить текст, например, "48 000 долларов", и проходить эту проверку ...

Я бы хотел следоватьтот же подход для процентных значений также ... например, "25%"

1 Ответ

1 голос
/ 13 августа 2012

Вы не хотите использовать не числовые значения внутри свойства decimal? для отображения.Есть несколько способов справиться с этим, но связыватель модели по умолчанию в MVC всегда будет пытаться явно сопоставить ######. ## с десятичным полем.Если у вас есть вспомогательный ввод, такой как $ ##, ###. ##, он взорвется, потому что его нельзя напрямую привести к десятичному значению.

У вас есть 2 решения, первое - использовать вводмаскировка как:

http://www.xaprb.com/html-input-mask/html-form-input-mask.html

или

http://digitalbush.com/projects/masked-input-plugin/

, которая настраивает только отображение интерфейса входа.

Или вы можете использовать ту же логику, что и в модели со строковым типом данных.

[DisplayName("GP")]
[DataType(DataType.Currency)]
[DisplayFormat(NullDisplayText = "$0", DataFormatString = "{0:C0}", ApplyFormatInEditMode = true)]
[Column("gross_profit")]
public string CurrencyDisplay { get; set; }

public decimal? CurrencyInput 
{
    get
    {
        //parse out non-int fields to return from value in CurrencyDisplay
    }

    set
    {
        //format string and seed into CurrencyDisplay
    }
}
...