从C#调用DisplayFormatAttribute的逻辑

时间:2016-11-05 23:12:11

标签: c# asp.net-mvc-5

在我的MVC5应用程序中,我在我的模型的属性上设置了此DisplayFormat属性。它确保我的双倍价值' TotalPrice'始终在屏幕上呈现两个小数位(在Razor页面中)

[DisplayFormat(DataFormatString = "{0:N2}")]
public Double? TotalPrice { get; set; }

我试图弄清楚如何从我的Controller(C#代码)中调用相同的逻辑。如下所示:

返回DataFormatAttribute.ApplyFormattingTo(shoppingCart.TotalPrice);

这显然不太正确但我希望有助于澄清这个问题。我对2个小数位的具体示例并不感兴趣,更多的是如何在C#中将属性的行为应用于值。

我已经下载了MVC5源代码,但对我来说,它有点太抽象了。

感谢您提供任何帮助。

2 个答案:

答案 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 "";
        }
    }
}