2013-12-17 32 views

cevap

16

Kendi ValidationAttribute'u uygulayabilirsiniz. Böyle Belki bir şey:

public class RequireWhenCategoryAttribute : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var employee = (EmployeeModel) validationContext.ObjectInstance; 
     if (employee.CategoryId == 1) 
     { 
      return ValidationResult.Success; 
     } 
     var emailStr = value as String; 
     return string.IsNullOrEmpty(emailStr) ? new ValidationResult("Value is required.") : ValidationResult.Success; 
    } 
} 

public sealed class EmployeeModel 
{ 
    [Required] 
    public int CategoryId { get; set; } 
    [RequireWhenCategory] 
    public string Email { get; set; } // If CategoryId == 1 then it is required 
} 

Bu sadece bir örnektir. Döküm sorunları olabilir ve bu sorunu çözmek için en iyi yaklaşımın bu olduğundan emin değilim.

+0

"* Bu sorunu çözmenin en iyi yolu olduğuna emin değilim. *" Sorunu çözmek için başka bazı yaklaşımlar ne olurdu? –

+0

@ScottChamberlain Mükemmel soru! Bilmiyorum. Sanki bir şekilde sızan bir soyutlama gibi hissediyorum. Doğrulamayı yapan özellik model türü hakkında çok şey bilir, vb. Bu özellik bir özellik aracılığıyla yapılmalı mı? Modelin davranış hakkında çok şey bildiğini ve modelin basitliğini kaybettiğini hissediyor. Kontrolör ne yapıyorsa o zaman? Hala emin değilim. – vcsjones

+2

@ vcsjones: İyi bir yaklaşım, aslında denetleyicideki doğrulama mantığından kaçınmak istiyorum, çünkü bunu yapmak istemediğim bir çok değişiklik gerekiyordu (değişiklik gereksinimine göre). –