【问题标题】:Formatting currency using display template in MVC在 MVC 中使用显示模板格式化货币
【发布时间】:2013-06-03 06:20:51
【问题描述】:

我发现这篇关于 MVC 的 Display 和 EditorTemplates 的帖子:

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 })

所以实际上我的一切工作都像它应该工作的那样工作。但不知何故,我不喜欢这种使视图更复杂的解决方案。

我的问题是:还有其他方法可以实现这样的事情吗?或者有什么建议可以优化我当前的解决方案?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    有关更多信息,请查看以下两个链接:

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

    【讨论】:

    • 不幸的是,我们有一些自定义规则来格式化货币字符串......这也会影响我的货币在每个使用它的地方的呈现,而我只想进行两种不同的实现。跨度>
    【解决方案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);
    

    【讨论】:

    • 感谢您的建议。这是否意味着我总是需要在视图的 viewdata 中设置属性?由于我想在一个视图中显示多个价格,但并非所有价格都应显示货币符号。当我开始阅读有关显示模板的内容时,我认为它们会使一切变得更容易和更清洁,但看起来它们愚弄了我:(
    • 您也可以在controller 中设置ViewData
    • 是的,我知道,但是对于我想在当前视图中格式化的每种货币,它都会具有相同的值。我有一个视图模型代表篮子中的一条线。其中一个属性是十进制价格。对于大多数行我不想要货币符号,对于小计和总计行,我确实想显示货币符号。然而,这两行都使用相同的对象(视图模型)来存储它们的值。
    • 您的ViewModel 是否包含SubTotalTotal 属性?
    • 是的,这将是我的下一步。
    猜你喜欢
    • 2012-05-31
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多