在我的MVC5应用程序中,我在我的模型的属性上设置了此DisplayFormat属性。它确保我的双倍价值' TotalPrice'始终在屏幕上呈现两个小数位(在Razor页面中)
[DisplayFormat(DataFormatString = "{0:N2}")]
public Double? TotalPrice { get; set; }
我试图弄清楚如何从我的Controller(C#代码)中调用相同的逻辑。如下所示:
返回DataFormatAttribute.ApplyFormattingTo(shoppingCart.TotalPrice);
这显然不太正确但我希望有助于澄清这个问题。我对2个小数位的具体示例并不感兴趣,更多的是如何在C#中将属性的行为应用于值。
我已经下载了MVC5源代码,但对我来说,它有点太抽象了。
感谢您提供任何帮助。
答案 0 :(得分:2)
我不确定它是否有可用的OOB,但看起来你需要阅读Attribute
并应用你的格式。编写一个扩展方法,根据DisplayFormatAttribute
DataFormatString
属性应用格式。
我希望这个示例可以帮助您入门,即使它不是一个精确的解决方案。此示例仅与DisplayFormatAttribute
public static string ApplyFormattingTo(this object myObject, string propertyName)
{
var property = myObject.GetType().GetProperty(propertyName);
var attriCheck = property.GetCustomAttributes(typeof(DisplayFormatAttribute), false);
if(attriCheck.Any())
{
return string.Format(((DisplayFormatAttribute)attriCheck.First()).DataFormatString,property.GetValue(myObject, null));
}
return "";
}
用法
Cart model= new Cart();
model.amount = 200.5099;
var formattedString = pp.ApplyFormattingTo("amount");
实际执行情况根据您的要求而有所不同。希望它有所帮助。
答案 1 :(得分:0)
@ Searching提供了答案,所以这只是我的最终代码,以防将来帮助其他人。 CartExtension 类为名为购物车的类提供扩展方法。
esp
然后,这可用于返回为屏幕预先格式化的值,例如在Controller方法中:
namespace MyApp.Models
{
public static class CartExtension
{
/// <summary>
/// Apply the formatting defined by the DisplayFormatAttribute on one of the Cart object's properties
/// programatically. Useful if the property is being rendered on screen, but not via the usual Html.DisplayFor
/// method (e.g. via Javascript or some other method)
/// </summary>
/// <param name="cart"></param>
/// <param name="propertyName"></param>
/// <returns></returns>
public static string ApplyFormattingTo(this Cart cart, string propertyName)
{
var property = cart.GetType().GetProperty(propertyName);
var attriCheck = property.GetCustomAttributes(typeof(DisplayFormatAttribute), false);
if (attriCheck.Any())
{
return string.Format(((DisplayFormatAttribute)attriCheck.First()).DataFormatString, property.GetValue(cart, null));
}
return "";
}
}
}