【问题标题】:ASP.NET MVC4: An attribute argument must be a constant expression , typeof expression or array creation expression of an attribute parameter typeASP.NET MVC4:属性参数必须是属性参数类型的常量表达式、typeof表达式或数组创建表达式
【发布时间】:2013-02-21 09:50:28
【问题描述】:

我有以下代码:

    [Required(ErrorMessage = MessageModel.translateMessage("required")))]
    [Display(Name= MessageModel.translateMessage("id"))]
    public string user_id { get; set; }

我正在尝试使错误消息动态化,但编译时出现错误。:

"An attribute argument must be a constant expression , typeof expression or array creation expression of an attribute parameter type."

这个问题有什么解决办法吗?

【问题讨论】:

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


【解决方案1】:

首先,您创建一个 Resource .resx 文件,该文件将包含您的本地化字符串。

当您声明属性时,您设置了 ResourceType 参数。这会导致将 Name、ShortName 和 Description 参数用作资源键而不是值。

[Display(Name = "GenreName", ShortName = "GenreShortName", Description = "GenreDescription", ResourceType = typeof(MyResources))]
public string Genre { get; set; }

【讨论】:

    【解决方案2】:

    错误消息显示“属性参数必须是常量表达式...”。

    这意味着DisplayName属性的参数必须是常量表达式(如字符串、整数等),或者错误消息中列出的任何其他表达式类型。

    如果你想本地化一个属性,那么你需要一个支持它的属性。如果你使用的是 ASP.Net 4,那么 DisplayAttribute 应该是这样的:

    [Display(Name="ID",Resource=typeof(MessageModel.translateMessage("id")))]
    public string user_id { get; set; }
    

    另外请查看来自 Darin 的 answer

    【讨论】:

    • translateMessage("id") 不是类型,所以我认为它不起作用
    【解决方案3】:

    回复很晚。

    DataAnnotations 参数值需要常量,实际字符串。 所以,你不能在这里写一个方法。您是否需要任何类型的本地化然后创建资源文件。然后编写类似这样的代码。这里“RequiredField”和“Email”是在资源文件中创建的键,“ViewModelResource”是资源文件的名称。

    [Required(ErrorMessageResourceName = "RequiredField", ErrorMessageResourceType = typeof(ViewModelResource))]
    [Display(Name = "Email", ResourceType=typeof(ViewModelResource))]
    public string Email{ get; set; }
    

    如果您想根据条件自定义消息,则根据条件创建您自己的“自定义数据注释”。

    【讨论】:

      猜你喜欢
      • 2011-12-10
      • 2011-12-05
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      相关资源
      最近更新 更多