8

я нашел этот пост про дисплей и EditorTemplates для MVC:Форматирование валюты с использованием шаблона отображения в MVC

http://www.growingwiththeweb.com/2012/12/aspnet-mvc-display-and-editor-templates.html

Это создает шаблон дисплея легко отображать десятичную отформатированный знак валюты.

модель, используемая в данном примере:

public class TestModel 
{ 
    public decimal Money { get; set; } 
} 

Шаблон отображения:

Views/Shared/DisplayTemplates/decimal.cshtml:

@model decimal 

@{ 
    IFormatProvider formatProvider = 
     new System.Globalization.CultureInfo("en-US"); 
    <span class="currency">@Model.ToString("C", formatProvider)</span> 
} 

В моем сайте у меня есть помощник класс с методом для извлечения форматированной строки валюты из десятичной дроби, поэтому я бы заменил выше:

@model decimal 
@(MyHelperClass.GetCurrencyString(Model)) 

И, наконец, вид, где мы хотим видеть отформатированный валюту:

@model TestModel  
@Html.DisplayFor(e => e.Money) 

Выход:

<span class="currency">$3.50</span> 

я могу осуществить это без каких-либо проблем. Но, конечно, у меня разные взгляды, где я хочу просмотреть форматированную валюту. Но в некоторых случаях я не хочу показывать знак валюты.

Мой вопрос теперь в том, как я должен реализовать это небольшое изменение, не переполняя код.

Вот моя текущая реализация:

Я изменил мой шаблон отображения этого:

@model decimal 

@{ 
    bool woCurrency = (bool)ViewData["woCurrency"]; 
} 

@(MyHelperClass.GetCurrencyString(Model)Model,woCurrency)) 

Конечно я также изменен метод GetCurrencyString принять этот дополнительный атрибут.

На мой взгляд, я теперь должен обеспечить этот атрибут тоже:

@Html.DisplayFor(m => m.Money, new { woCurrency = true }) 

Так на самом деле я все работает, как он должен работать. Но почему-то мне не нравится это решение, которое делает представление более сложным.

Мой вопрос к вам: есть ли какой-либо другой способ реализовать что-то подобное? Или какие-либо советы по оптимизации моего текущего разрешения?

Спасибо!

ответ

2

Как насчет HtmlHelper, который автоматически проверяет ViewData["woCurrency"] и выводит правильный результат?

public static string Currency(this HtmlHelper helper, decimal data, string locale = "en-US", bool woCurrency = false) 
    { 
     var culture = new System.Globalization.CultureInfo(locale); 

     if (woCurrency || (helper.ViewData["woCurrency"] != null && (bool)helper.ViewData["woCurrency"])) 
      return data.ToString(culture); 

     return data.ToString("C", culture); 
    } 

Тогда:

@Html.Currency(Model.Money); 
+0

Спасибо за предложение. Означает ли это, что мне всегда нужно установить свойство в viewdata в представлении? Поскольку у меня есть несколько цен, которые я хочу показать в одном представлении, но не все из них должны показывать знак валюты. Когда я начал читать о шаблонах отображения, я думал, что они сделают все намного проще и чище, но похоже, что они меня обманули :( – ThdK

+0

Вы также можете установить 'ViewData' в' controller'. – haim770

+0

Да, я знаю, но тогда это будет иметь то же значение для каждой валюты, которую я хочу отформатировать в текущем виде.У меня есть viewmodel, представляющий строку в корзине.Один из свойств является десятичной Цена. Для большинства строк я не хочу, чтобы знак валюты, для промежуточные и итоговые строки, я хочу показать знак валюты. Однако обе строки используют один и тот же объект (viewmodel) для хранения своих значений. – ThdK

17

Вам необходимо применить атрибут DisplayFormat к свойству Money.Например:

[DisplayFormat(DataFormatString = "{0:C}")] 
public decimal Money { get; set; } 

Для получения дополнительной информации посмотрите на эти две ссылки:

  1. DisplayFormatAttribute.DataFormatString (пример в нижней части страницы использует валюту форматирования в качестве примера)
  2. ASP.NET MVC - DisplayFormat attribute
+0

Unfortunatly, у нас есть некоторые пользовательские правила форматирования строки валюты ... Это также влияет на предоставление моей валюты на каждом месте, он используется в то время как я просто хочу сделать две разные реализации. – ThdK