【问题标题】:Can I use other attribute arguments than numbers in DataAnnotations.StringLength?我可以在 DataAnnotations.StringLength 中使用除数字之外的其他属性参数吗?
【发布时间】:2019-09-08 13:24:37
【问题描述】:

我有一个包含所有硬编码代码的(设置)类。对于某些字段(例如 maxCharactersFields 和错误消息)非常方便,这样我可以将相同的字段用于映射、模型和视图模型。因此,如果要在未来改变它,一切都会以同样的方式改变。但是,我似乎无法在视图模型中使用它。更具体地说,在 System.ComponentModel.DataAnnotations 的 StringLength 中。

它给出的错误是“属性参数必须是属性参数类型的常量表达式、typeof表达式或数组创建表达式。”

我已经尝试过的某些事情是用我正在工作的 ViewModel 中的一个字段替换它,但它给出了同样的错误。我在 StackOverflow 上进行了谷歌搜索和搜索,但似乎找不到任何尝试做这样的事情并遇到同样问题的人。

到目前为止,我了解到我不能使用我的 Settings 类,因为它不是基本类型,但有办法解决它吗?

错误发生在StringLength这一行。

[Display (Name = "E-mail van de gebruiker", Prompt = "John.Doe@gmail.com")]
        [DataType (DataType.EmailAddress)]
        [Required]
        [StringLength(Settings.maxCharactersEmail)]
        public string Email { get; set; }
    public static class Settings
    {
....
        public static readonly int maxCharactersEmail= 320; //Googled it
....
    }

【问题讨论】:

  • 如果您希望验证规则是可配置的,您必须在代码中验证模型。至于“硬编码设置”,它们没有理由。您可以从各种来源读取配置。您也可以在完整框架中使用与 .NET Core 相同的配置系统,只需将 Microsoft.Extensions.Configuration 包添加到您的应用程序,并从多种文件格式、数据库、环境变量等读取配置设置。同样适用于依赖注入。

标签: c# componentmodel


【解决方案1】:

它实际上与你的设置类类型没有任何关系。属性是编译时的东西,所以你不能使用静态或实例值。你必须使用常量值(public const int):

public static class Settings
{
    public const int maxCharactersEmail= 320; //Googled it
}

你的属性现在可以工作了:

[Display (Name = "E-mail van de gebruiker", Prompt = "John.Doe@gmail.com")]
[DataType (DataType.EmailAddress)]
[Required]
[StringLength(Settings.maxCharactersEmail)]
public string Email { get; set; }

【讨论】:

  • 但是,有没有一种方法可以通过强制转换或查找漏洞以某种方式使用我的 Settings 类中的 int,因为如果要更改它,那么我每次都必须在 2 个位置更改它。对于一个属性,这无关紧要,但大约有 200 个,很容易忘记一个。
  • 哦,我读完了,非常感谢!你为我节省了很多时间!祝你有美好的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多