c# asp.net asp.net-mvc asp.net-mvc-4 fluentvalidation

c# - FluentValidation validación de nombres únicos utilizando la base de datos



asp.net asp.net-mvc (1)

El Validador de Predicados (también conocido como Debe) tiene una sobrecarga, que acepta el predicado con dos parámetros (objeto validado y valor de propiedad). En su caso, el predicado tendrá el tipo Func<Category, string, bool> . Tan solo agregue el parámetro Category a su método de validación de nombre único:

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

Tengo un modelo de categoría que tiene un campo Nombre, y cada nombre de categoría debe ser único. He realizado la validación y funciona cuando intento crear una nueva categoría, pero tengo problemas al intentar editarla. Por ahora solo está comprobando si el nombre existe y, por supuesto, lo hace cuando intento editar la misma categoría.

Modelo

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

Como puede ver, tengo la UniqueName(string name) , pero ¿cómo puedo pasar la ID o el modelo completo para que pueda verificar si es la misma ID que el modelo que estoy tratando de editar y luego pasar? ¿Cómo podría pasar algo como UniqueName(string name, int? id) ? Descubrí FluentValidation solo hoy y no puedo entenderlo.