【问题标题】:Set DataFormatString in Annotations from a Global Variable在全局变量的注释中设置 DataFormatString
【发布时间】:2012-12-13 05:50:28
【问题描述】:

假设我有如下注释

[DisplayFormat(DataFormatString = "{0:#.00#}", ApplyFormatInEditMode = true)]

效果很好。但是假设我想根据用户选择的某些应用程序设置实时替换 DataFormatString,即有时像这样 {0:#.00#} 有时是 {0:#.000#}。有没有办法做到这一点?

我尝试将格式字符串存储在全局变量中,但它给了我以下错误。

属性参数必须是常量表达式,typeof 表达式 或属性参数类型的数组创建表达式

如果我将全局变量设为常量,它可以工作,但目的就失去了。关于变通方法的任何建议?

基本上,我想为用户提供一个选项来通用设置小数位,而不必在每个视图/控制器的基础上实现该功能。

我知道我可以使用 NumberFormat.CurrencyDecimalDigits 来设置文化。但这会忽略小数点后的零。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 data-annotations


    【解决方案1】:

    属性需要常量字符串,你不能改变它。此外,此属性不提供提供资源名称的能力。所以,我认为最好的方法是为这个属性创建 DisplayTemplate 和 EditorTemplate。

    [UIHint("Bar")]
    public decimal Bar { get; set; }
    

    并且在 Bar 模板中,您可以根据用户选择的一些应用程序设置更改格式:

    @model decimal
    
    @Model.ToString(HttpContext.Current.Session["format"].ToString())
    

    【讨论】:

    • 感谢您的反馈。很高兴确认 Annotation 方法不起作用。但我不能使用模板,因为在实际情况下,用户有两类字段。两者都是小数类型,但一个类别可能需要 3 个小数,而另一个类别需要 2 个位。 :\ 当然,我可以创建两个模板并根据具体情况附加它们,但这又让我在每个视图/控制器的基础上应用它,我希望避免这种情况。
    • 好的.. 我刚刚知道你在那里做了什么。我是“UIHint”的新手。让我检查一下这是否可以帮助我并返回。谢谢。
    • 非常感谢...这非常符合我的要求。 UIHint 的东西非常有用。我不认为你可以告诉我当类型是可以为空的十进制即十进制时你将如何处理这个问题?问题是我不能使用带有可空小数格式的 tostring()。
    • @ManekshVeetinal 是的,设置模板模型为@model Nullable<decimal>decimal?
    • 我已经做到了。实际上问题是 tostring(someformat) 不能用于十进制? .那么通常我们需要转换十进制吗?在应用格式之前转换为十进制。在这种情况下,一旦我的模板是十进制的?我无法将模型从模板中的 with 更改为十进制...所以无法应用格式。
    【解决方案2】:

    有一个很好的库叫做MvcExtensions,它的一个特点是流畅的元数据配置。它允许您流畅地构建模型元数据,而不是 DataAnnotations。 使用这个库,你可以完成你的任务:

    Configure(x => x.Payment)
      .Format(() => ConfigurationManager.DataFormatString)
    

    【讨论】:

    • 感谢您的反馈。基本上尽量避免任何扩展。担心未来的兼容性和东西。 :)
    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多