Jam*_*mie 4 asp.net-mvc model data-annotations
我想从我的模型中的一个属性传递一个值到我的数据注释来验证我的密码属性,但我不知道如何实现这一点.当我这样做时,我收到以下错误:
an attribute argument must be a constant expression typeof expression or array
Run Code Online (Sandbox Code Playgroud)
我的模特:
public class LoginModel
{
public string Voornaam { get; set; }
public string Achternaam { get; set; }
public string Gebruikersnaam { get; set; }
[Password(AttributeVoornaam = this.Voornaam, AttributeAchternaam = this.Achternaam, AttributeGebruikersnaam = this.Gebruikersnaam)]
public string Wachtwoord { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的数据注释中,我这样做:
public class PasswordAttribute : ValidationAttribute
{
public string AttributeVoornaam { get; set; }
public string AttributeAchternaam { get; set; }
public string AttributeGebruikersnaam { get; set; }
public override bool IsValid(object value)
{
string strValue = value.ToString();
if (strValue.Contains(AttributeVoornaam.ToLower()) || strValue.Contains(AttributeAchternaam.ToLower()) ||
strValue.Contains(AttributeGebruikersnaam.ToLower()))
{
ErrorMessage = "Uw wachtwoord mag niet uw voornaam, achternaam of gebruikersnaam bevatten.";
return false;
}
else
{
return true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您不能将变量值(在编译时未计算的值)传递到属性中.它们必须是字面值或常量值.
但是,您可以传递给属性的是要在运行时评估的模型属性的名称,然后让您的IsValid方法在运行时通过访问ValidationContext返回a ValidationResult的覆盖来评估这些值.ValidationAttribute.
或者,如果您总是在评估这些相同的属性,那么您可以获取对模型的引用,并直接使用它:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
LoginModel loginModel = (LoginModel)validationContext.ObjectInstance;
string strValue = value.ToString();
if (strValue.Contains(loginModel.Voornaam.ToLower()) ||
strValue.Contains(loginModel.Achternaam.ToLower()) ||
strValue.Contains(loginModel.Gebruikersnaam.ToLower()))
{
ErrorMessage = "Uw wachtwoord mag niet uw voornaam, achternaam of gebruikersnaam bevatten.";
return false;
}
else
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
这是不可能的,因为属性(包括它们的数据)在编译时被放入程序集的元数据中。请参阅MSDN 上的属性参数类型。
相反,您可以将依赖属性的名称作为字符串传递。我将向您展示一个包含一个属性的示例,您将以相同的方式添加其他属性:
public class PasswordAttribute : ValidationAttribute
{
public PasswordAttribute(string voornaamPropertyName)
{
if(string.IsNullOrEmpty(voornaamPropertyName))
throw new ArgumentNullException("voornaamPropertyName");
VoornaamPropertyName = voornaamPropertyName;
}
public string VoornaamPropertyName { get; set; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
PropertyInfo voornaamPropertyInfo = validationContext.ObjectType.GetProperty(VoornaamPropertyName);
if (voornaamPropertyInfo == null)
{
return new ValidationResult(String.Format(CultureInfo.CurrentCulture, "Could not find a property named {0}", VoornaamPropertyName));
}
var voornaamProperty = voornaamPropertyInfo.GetValue(validationContext.ObjectInstance); // here you have the value of the property
...
}
}
Run Code Online (Sandbox Code Playgroud)
然后
[Password("Voornaam")]
public string Wachtwoord { get; set; }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7958 次 |
| 最近记录: |