Как мне использовать EditorFor () в MVC для типа валюты / денег?

18

На мой взгляд, у меня есть следующий вызов.

<%= Html.EditorFor(x => x.Cost) %>

У меня есть ViewModel со следующим кодом для определения стоимости.

public decimal Cost { get; set; }

Однако это показывает десятичное значение с четырьмя цифрами после десятичной (например, 0,0000). Я знаю о Decimal.toString("G") ( MSDN ), который, как представляется, решает эту проблему, m неизвестно, где его применять.

Одним из решений является создание частичного представления «Currency.aspx».

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Decimal>" %>
<%= Html.TextBox(Model.ToString("g"), new { @class = "currency" }) %>

И [UIHint("Currency")] в моей модели ViewModel.

Это кажется неэлегантным. Я предполагаю, что эта проблема была решена аккуратно где-то в рамках MVC или C #, но я не знаю о более чистых решениях.

Каков подходящий способ обработки значений валютных значений в MVC?

    
задан Thomas Langston 22.02.2011 в 16:53
источник

2 ответа

39
[DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)]
public decimal Cost { get; set; }

и на ваш взгляд:

<%= Html.EditorFor(x => x.Cost) %>

и все.

Возможно, вы захотите применить пользовательский класс CSS. Вы можете сделать это:

<div class="currency">
    <%= Html.EditorFor(x => x.Cost) %>
</div>

, а затем в вашем css:

.currency input {
    /** some CSS rules **/
}

или напишите пользовательский DataAnnotationsModelMetadataProvider , который позволит вам:

[DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)]
[HtmlProperties(CssClass = "currency")]
public decimal Cost { get; set; }

, а затем, на ваш взгляд:

<%= Html.EditorFor(x => x.Cost) %>
    
ответ дан Darin Dimitrov 22.02.2011 в 16:59
источник
  • Это красиво. –  Thomas Langston 22.02.2011 в 17:01
  • No @class="currency" в этой версии. –  jfar 22.02.2011 в 17:05
  • @jfar, обновления уже в пути. –  Darin Dimitrov 22.02.2011 в 17:06
  • Это здорово, если у вас есть только несколько полей валют, чтобы показывать редакторов. Если вы будете повторять всю свою заявку, подход Currency.aspx подходит. –  Robert Levy 22.02.2011 в 17:10
  • +1 для отличной ссылки –  André Pena 15.03.2012 в 20:14
Показать остальные комментарии
3

Это подходящий способ, если вы используете шаблоны EditorFor.

Что означает «чрезмерно неэлегантный»?     

ответ дан jfar 22.02.2011 в 16:56
источник
  • Это означает, что в решении есть много уродливого кода. Устранение ошибки форматирования, которая должна быть непосредственно адресована либо языком, либо каркасом (мы говорим о типах валют, а не о какой-то неясной идее), не должны требовать 3 строки кода для двух файлов, ни один из которых фактически не содержит вызов EditorFor ( ). –  Thomas Langston 22.02.2011 в 17:12
  • @ Томас Лэнгстон ROFL! Вы используете механизм шаблонов, основанный на метаданных, который удаляет сотни строк кода котла html + c # и как-то 3 строки в двух файлах слишком много? –  jfar 22.02.2011 в 19:33