これを行う方法は、属性を拡張するカスタム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);
モデルが正しく渡された場合。
もちろん、エラーチェックなどを行う必要があります。