2012-11-15 17 views
15

I Categoria modello con campo Nome e ogni nome di categoria deve essere univoco. Ho effettuato la convalida e funziona quando provo a creare una nuova categoria, ma ho un problema quando provo a modificarla. Per ora si tratta solo di verificare se il nome esiste e ovviamente lo fa quando provo a modificare la stessa categoria.FluentValidation convalida del nome univoco tramite database

Modello

[Validator(typeof(CategoryValidator))] 
public class Category 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    virtual public ICollection<Image> Images { get; set; } 
} 

public class CategoryValidator : AbstractValidator<Category> 
{ 
    public CategoryValidator() 
    { 
     RuleFor(x => x.Name).NotEmpty().WithMessage("Category name is required.").Must(UniqueName).WithMessage("This category name already exists."); 
    } 

    private bool UniqueName(string name) 
    { 
     ProjecteDataContext _db = new ProjecteDataContext(); 
     var category = _db.Categories.Where(x => x.Name.ToLower() == name.ToLower()).SingleOrDefault(); 

     if (category == null) return true; 
     return false; 
    } 
} 

Come potete vedere ho UniqueName(string name) funzione, ma come faccio a passare ID, o tutto il modello in esso in modo da poter verificare se è lo stesso ID come modello che sto cercando di modificare poi passa. Come potrei passare qualcosa come UniqueName(string name, int? id)? Ho scoperto FluentValidation solo oggi e non riesco a capirlo.

risposta

20

Predicate Validator (aka Must) ha un sovraccarico, che accetta il predicato con due parametri (oggetto convalidato e valore della proprietà). Nel tuo caso il predicato avrà il tipo Func<Category, string, bool>. Quindi basta aggiungere il parametro Category al metodo di convalida del nome univoco:

private bool UniqueName(Category category, string name) 
{ 
     ProjecteDataContext _db = new ProjecteDataContext(); 
     var dbCategory = _db.Categories 
          .Where(x => x.Name.ToLower() == name.ToLower()) 
          .SingleOrDefault(); 

     if (dbCategory == null) 
      return true; 

     return dbCategory.ID == category.ID; 
} 
+0

Grazie, ora. – sed

+1

nota a margine: è necessario disporre di DbContext non appena hai finito con esso, quindi "utilizzando (var _db = new ProjecteDataContext())" –

Problemi correlati