Asp.net mvc 3 是否可以强制数据类型为DataType.currency的MVC3字段使用货币
我正在编写一个MVC3应用程序,它从数据库中读取大量货币数据。我的问题是,这些金额都是不同的货币 如果我这样设置字段的类型:Asp.net mvc 3 是否可以强制数据类型为DataType.currency的MVC3字段使用货币,asp.net-mvc-3,data-annotations,globalization,currency,Asp.net Mvc 3,Data Annotations,Globalization,Currency,我正在编写一个MVC3应用程序,它从数据库中读取大量货币数据。我的问题是,这些金额都是不同的货币 如果我这样设置字段的类型: [DataType(DataType.Currency)] public Amount{ get; set;} 我得到了小数位和货币符号,看起来不错,但它默认为用户的本地货币。美国用户看到的是$423.29,而GB用户看到的是$423.29。我可以使用Web.config中的覆盖货币,但这会全局设置所有货币字段 标记字段以使其显示正确的小数位数和货币符号的最简单方法是什
[DataType(DataType.Currency)]
public Amount{ get; set;}
我得到了小数位和货币符号,看起来不错,但它默认为用户的本地货币。美国用户看到的是$423.29
,而GB用户看到的是$423.29
。我可以使用Web.config中的
覆盖货币,但这会全局设置所有货币字段
标记字段以使其显示正确的小数位数和货币符号的最简单方法是什么
在理想的世界中,我希望能够做这样的事情(美元):
并且始终以$439.38的形式呈现,但这在内置注释中是不可能的。您需要识别区域性:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
在此控制器内重写了以下方法:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
protected override void ExecuteCore()
阅读NadeemAfana博客中的整个技巧,我的方法是创建一个扩展
数据类型的自定义属性和一个自定义html帮助器。这不一定是最简单的方法,但它会在将来节省时间
编辑
合并CultureInfo.CreateSpecificCulture(cultureName)
而不是开关
自定义属性
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());
}
}
然后在您的视图中,您可以通过
@Html.CurrencyDisplayFor(x => x.Amount);
如果您的模型传递正确
显然,您需要执行错误检查等操作。将字符串设置为金额
public string Amount{ get; set;}
创建一个方法,将其转换为具有精确货币的字符串
private string LocalizedAmount(decimal theAmount, string cultureName)
{
return theAmount.ToString("c",CultureInfo.CreateSpecificCulture(cultureName));
}
如果数据库中存储了两个字段或列,一个用于值,一个用于区域性
在存储库或控制器中:
Amount = LocalizedAmount(Convert.ToDecimal(reader[0]),reader[1].ToString());
如果同一个控制器需要以美元、英镑和(比如)欧元呈现字段,这将有何帮助?如果您应该根据每个用户的文化进行呈现,这将有所帮助。这是你的需要吗?一点也不需要。我不在乎用户所处的文化。我关心货币数据使用何种货币,并相应地显示它。这不是标准化数据类型的一种方式,但是,如果您将数据更改为字符串,并使用.ToString(“c”,CultureInfo.CreateSpecificCulture(cultureName))进行解析;您将以每种货币返回一个数字,并返回货币符号谢谢-我会尝试一下。+1这可以与我的答案结合在一起,这意味着他不需要更改财产的类型,这可能会在其他地方造成问题。是的,但据我所知,您将获得一个列表,因为产品具有金额属性,每种产品都有自己的电流。您如何在回复中实现对第纳尔货币的管理?如果您需要使用它来完成您的回答,请继续!我看不到OP的任何地方说他得到了一个列表
——或者我遗漏了什么?我只是从他的“理想世界”陈述开始,这正是我的答案。虽然我没有想到CultureInfo.CreateSpecificCulture
解决方案,但这真的很好:)我是从作者的这条信息中猜出来的:一点也没有。我不在乎用户所处的文化。我关心的是货币数据是什么货币,并相应地显示出来
private string LocalizedAmount(decimal theAmount, string cultureName)
{
return theAmount.ToString("c",CultureInfo.CreateSpecificCulture(cultureName));
}
Amount = LocalizedAmount(Convert.ToDecimal(reader[0]),reader[1].ToString());