asp.net-mvc-3 - 是否可以为DataType为DataType.Currency的MVC3字段强制使用货币

标签 asp.net-mvc-3 data-annotations globalization currency

我正在编写一个MVC3应用程序,该应用程序从数据库中读取大量货币数据。我的问题是这些金额全部使用不同的货币。

如果我像这样设置字段的类型:

[DataType(DataType.Currency)]
public Amount{ get; set;}

我得到了小数位和一个货币符号,看起来不错,但默认为用户的本地货币。美国用户看到$423.29,而GB用户看到£423.29。我可以通过在Web.config中使用<globalization culture="{something}">覆盖货币,但这会全局设置所有货币字段。

标记字段以使其具有正确的小数位和货币符号的最简单方法是什么?

在理想的世界中,我希望能够执行以下操作(对于USD):
[DataType(DataType.Currency, culture="en-us")]
public Amount{ get; set; }

并且始终将其渲染为$439.38,但是内置注释无法实现。

最佳答案

我这样做的方法是创建一个自定义属性,该属性扩展了DataType属性和一个自定义html帮助器。这不一定是最简单的方法,但可以节省将来的时间。

编辑
合并了CultureInfo.CreateSpecificCulture(cultureName)而不是switch
自定义属性

public class CurrencyDisplayAttribute : DataTypeAttribute
{
    public string Culture { get; set; }

    public CurrencyDisplayAttribute(string culture)
        : base(DataType.Currency)
    {
        Culture = culture;
    }
}  

HTML帮助程序
public static class Helpers
{
    public static IHtmlString CurrencyDisplayFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
    {
        double value = double.Parse(expression.Compile().Invoke(helper.ViewData.Model).ToString());
        var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);

        var prop = typeof (TModel).GetProperty(metadata.PropertyName);

        var attribute = prop.GetCustomAttribute(typeof (CurrencyDisplayAttribute)) as CurrencyDisplayAttribute;

        // this should be whatever html element you want to create
        TagBuilder tagBuilder = new TagBuilder("span");
        tagBuilder.SetInnerText(value.ToString("c", CultureInfo.CreateSpecificCulture(attribute.Culture));

        return MvcHtmlString.Create(tagBuilder.ToString());
    }
}

您可以在模型中使用该属性
[CurrencyDisplay("en-us")]
public double Amount { get; set; }

然后,在您看来,您可以通过以下方式使用帮助器:
@Html.CurrencyDisplayFor(x => x.Amount);

只要您的模型正确传递。

显然,您需要进行错误检查等。

关于asp.net-mvc-3 - 是否可以为DataType为DataType.Currency的MVC3字段强制使用货币,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12408530/

相关文章:

model-view-controller - 将模型转换为 View 模型

asp.net-mvc-3 - MVC 3 数据库优先中的客户端验证

c# - 首先在 EF 代码中混合 Fluent API 和 DataAnnotations

c# - 获取 DisplayName 属性的所有值

c# - 是否可以在 MVC3 (C#) 中为 `[Display(Name="Something")]` 数据注释使用变量

c# - 为什么我不能在设计时在 XAML 中使用 CultureInfo.CurrentCulture?

Mysql 禁用国际字符串比较

localization - 处理存储中的时区?

jquery - 循环 Controller 返回的json数据

c# - 如何在加载列表框时选择第一个项目