Форматирование валюты MVC

Я пытаюсь отформатировать текстовое поле Html.EditorFor для форматирования валюты, я пытаюсь основывать его на этом потоке String.Format для валюты в TextBoxFor. Однако мой текст по-прежнему отображается как 0,00 без форматирования валюты.

<div class="editor-field">
        @Html.EditorFor(model => model.Project.GoalAmount, new { @class = "editor-     field", Value = String.Format("{0:C}", Model.Project.GoalAmount) })

Вот код того, что я делаю, и вот html для этого поля на самом веб-сайте, который, конечно же, содержится в div-поле редактора.

<input class="text-box single-line valid" data-val="true" 
 data-val-number="The field Goal Amount must be a number." 
 data-val-required="The Goal Amount field is required."
 id="Project_GoalAmount" name="Project.GoalAmount" type="text" value="0.00">

Любая помощь будет оценена, спасибо!


person Him_Jalpert    schedule 24.05.2012    source источник


Ответы (1)


Вы можете украсить свое свойство модели представления GoalAmount атрибутом [DisplayFormat]:

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

и в представлении просто:

@Html.EditorFor(model => model.Project.GoalAmount)

Второй аргумент помощника EditorFor делает совсем не то, что вы думаете. Он позволяет передавать в шаблон редактора дополнительные ViewData, а не htmlAttributes.

Другая возможность — написать собственный шаблон редактора для валюты (~/Views/Shared/EditorTemplates/Currency.cshtml):

@Html.TextBox(
    "", 
    string.Format("{0:c}", ViewData.Model),
    new { @class = "text-box single-line" }
)

а потом:

@Html.EditorFor(model => model.Project.GoalAmount, "Currency")

или используйте [UIHint]:

[UIHint("Currency")]
public decimal GoalAmount { get; set; }

а потом:

@Html.EditorFor(model => model.Project.GoalAmount)
person Darin Dimitrov    schedule 24.05.2012
comment
Какова строка формата для валюты (фунты) без пенсов? Кажется, я пока не могу его найти. Спасибо. - person IAmGroot; 04.02.2013
comment
@DarinDimitrov У меня есть сейчас! ;) Спасибо. - person IAmGroot; 04.02.2013
comment
Мне пришлось преобразовать ваш ViewData.Model в decimal после преобразования или анализа его в один для TextBox, чтобы удовлетворить правильную перегрузку. string.Format("{0:c}", (decimal)decimal.Parse(Model))) ) - person The Muffin Man; 07.02.2013
comment
Как решить проблему, связанную с форматированием поля валюты при привязке модели при публикации формы? Поскольку в поле формы есть недопустимые символы для десятичного числа, привязка не заполняет значение при публикации формы. Кажется тяжелым, чтобы создать собственный связующий для этого сценария... - person Mark; 08.02.2013
comment
Seems heavy handed to have to create a custom binder for this scenario - Именно так бы я поступил, если бы мне пришлось поддерживать этот сценарий. Но я бы написал так, чтобы он использовал атрибут DisplayFormat, которым было оформлено свойство модели представления, и повторно использовал тот же формат для отображения и привязки. - person Darin Dimitrov; 08.02.2013
comment
Это помогло мне, но я установил ApplyFormatInEditMode = true на ApplyFormatInEditMode = false - это останавливает сообщение проверки ввода, которое должно быть числом, когда символ валюты присутствует в текстовом поле редактирования. - Я думаю, что пользователь должен знать, с какой валютой он работает - в любом случае, если используется управление несколькими валютами, символ валюты должен храниться вместе со значением, иначе как узнать, указана ли сумма в фунтах, долларах или евро, если смотреть на базу данных. - person Piotr Kula; 09.05.2014
comment
Рад видеть, что этот вопрос помог многим людям! - person Him_Jalpert; 03.07.2014
comment
Мне нужно было добавить @model IFormattable в начале. Также в наши дни мы можем писать typesafe [DataType(DataType.Currency)] вместо UIHint - person Christian Gollhardt; 17.01.2016