2014-02-10 36 views
2

我想將我的模型中的某個屬性的值傳遞給我的數據註釋以驗證我的密碼屬性,但我不知道如何實現此目的。ASP.NET MVC-將模型值傳遞給數據註釋參數

an attribute argument must be a constant expression typeof expression or array 

我的模型:

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; } 
} 

而在我的數據註解我這樣做:

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; 
     } 
    } 
} 

回答

4

你可以當我在這樣,我得到以下錯誤這樣做不會將變量值(在編譯時不計算的值)傳遞給屬性。它們必須是文字值或常量值。

可以進入屬性是什麼,不過,是要在運行時進行評估,然後讓你的IsValid方法模型的屬性名稱通過訪問評估在運行時將這些值ValidationContext覆蓋中返回的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; 
    } 
} 
+1

這工作得很好,我對一些小的調整,謝謝! – Jamie

+0

爲什麼你返回布爾值而不是'ValidationResult's? – muttley91

1

據我所知,你不能通過變量值轉換成屬性。你可以添加自定義的驗證規則給你的模型:

public class LoginModel: IValidatableObject 
{ 
    public string Voornaam {get;set;} 
    public string Achternaam {get;set;} 
    public string Gebruikersnaam {get;set;} 

    public string Wachtwoord { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var results = new List<ValidationResult>(); 
     var pwd = this.Wachtwoord.ToLower(); 
     if(pwd.Contains(this.Voornaam.ToLower()) || pwd.Contains(this.Achternaam.ToLower()) || pwd.Contains(this.Gebruikersnaam.ToLower())){ 
      results.Add(new ValidationResult("Uw wachtwoord mag niet uw voornaam, achternaam of gebruikersnaam bevatten.")); 
     } 
     return results; 
    } 
} 

你也可以把它變成多個if語句,並添加單獨的ValidationResults(一個用於Voornaam,一個用於Achternaam,一個用於Gebruikersnaam)。

3

這是不可能的,因爲包括它們的數據在內的屬性在編譯時被放入程序集的元數據中。請參閱MSDN上的Attribute parameter types

相反,您可以將依賴屬性的名稱作爲字符串傳遞。我會告訴你一個樣本有一個屬性,你會添加其他以同樣的方式:

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 

     ... 
    } 
} 

然後

[Password("Voornaam")] 
public string Wachtwoord { get; set; }