为什么我不能将资源用作具有DataAnnotations的ErrorMessage?

时间:2010-04-22 07:17:58

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

为什么我不能这样做?

[Required(ErrorMessage = "*")]
[RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessage = Resources.RegistrationModel.UsernameError)]
public string Username { get; set; }

告诉我的错误信息是什么?

  

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

6 个答案:

答案 0 :(得分:42)

当您使用ErrorMessage属性时,只能为其分配常量字符串或字符串文字。

使用ErrorMessageResourceTypeErrorMessageResourceName代替您的资源。

[RegularExpression(
    "^[a-zA-Z0-9_]*$", 
    ErrorMessageResourceType=typeof(Resources.RegistrationModel),
    ErrorMessageResourceName= "UsernameError"
)]

请注意,资源必须公开(可以在资源编辑器中设置)。

Setting resource access to public http://img402.imageshack.us/img402/504/98454371.jpg

答案 1 :(得分:3)

请参阅此链接: http://code.msdn.microsoft.com/Getting-Started-WCF-RIA-1469cbe2/sourcecode?fileId=19242&pathId=774666288 (链接已损坏,但仍可用于归档目的)

public sealed partial class RegistrationData 
{ 
    [Key] 
    [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ErrorResources))] 
    [Display(Order = 0, Name = "UserNameLabel", ResourceType = typeof(RegistrationDataResources))] 
    [RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessageResourceName = "ValidationErrorInvalidUserName", ErrorMessageResourceType = typeof(ErrorResources))] 
    [StringLength(255, MinimumLength = 4, ErrorMessageResourceName = "ValidationErrorBadUserNameLength", ErrorMessageResourceType = typeof(ErrorResources))] 
    public string UserName { get; set; } 

答案 2 :(得分:1)

试试FluentModelMetaDataProvider

管理以强类型方式将资源用于错误消息。

看起来像这样:

using System.Web.Mvc.Extensibility;

namespace UI.Model
{
    public class StoreInputMetadata : ModelMetadataConfigurationBase<StoreInput>
    {
        public StoreInputMetadata()
        {
            Configure(m => m.Id)
                .Hide();
            Configure(model => model.Name)
                .Required(Resources.Whatever.StoreIsRequired)
                .MaximumLength(64, Resources.Whatever.StoreNameLengthSomething);
        }
    }
}

  

告诉我的错误信息是什么?

     
    

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

  

它已经自我解释了。 C#不是像Ruby这样的动态语言,您可以编写在运行时继承随机基类的类。 :)

Here's Skeet对此有何看法。

答案 3 :(得分:0)

这意味着您无法确定要传递到runtime属性的参数的值,它必须位于compile time,因此该值将嵌入到程序集中。

错误消息值必须是常量表达式。

有关信息,属性参数只能是bool,byte,char,short,int,long,float,double,string,System.Type和enums类型。

答案 4 :(得分:0)

您应该查看此属性的ErrorMessageResourceNameErrorMessageResourceType属性。它们允许从资源中提取错误消息。

答案 5 :(得分:0)

我们现在可以将nameof用于强类型错误消息:

[RegularExpression("^[a-zA-Z0-9_]*$", 
  ErrorMessageResourceType=typeof(Resources.RegistrationModel),
  ErrorMessageResourceName=nameof(Resources.RegistrationModel.UsernameError)
)]