我正在编写一个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/