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

时间:2013-02-21 09:50:29

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

我有以下代码:

    [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."

针对此问题的任何解决方案?

3 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:3)

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

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

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

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

另请查看Darin的answer

答案 2 :(得分:2)

很晚才回应。

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

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

如果您想在条件上自定义消息,那么创建您自己的“自定义数据注释”取决于条件。