使用MVC中的显示模板格式化货币

时间:2013-06-03 06:20:52

标签: asp.net-mvc model-view-controller mvc-editor-templates asp.net-mvc-templates

我发现这篇关于MVC的Display和EditorTemplates的文章:

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

它会创建一个显示模板,以便轻松显示使用货币符号格式化的十进制数。

示例中使用的模型:

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

显示模板:

查看/共享/ 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 个答案:

答案 0 :(得分:18)

您需要将DisplayFormat属性应用于Money属性。例如:

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

有关详细信息,请查看以下两个链接:

  1. DisplayFormatAttribute.DataFormatString(页面底部的示例使用货币格式作为示例)
  2. ASP.NET MVC - DisplayFormat attribute

答案 1 :(得分: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);