Я написал шаблон T4, который автоматически генерирует все проверки следующим образом:
public class UserValidator : AbstractValidator<User>
{
public UserValidator()
{
RuleFor(x => x.Email).NotEmpty();
RuleFor(x => x.Email).Length(0, 150).WithMessage("Email can not exceed 150 characters");
RuleFor(x => x.Password).NotEmpty();
RuleFor(x => x.Password).Length(0, 50).WithMessage("Password can not exceed 50 characters");
RuleFor(x => x.Name).NotEmpty();
RuleFor(x => x.Name).Length(0, 100).WithMessage("Name can not exceed 100 characters");
RuleFor(x => x.PhoneNumber).Length(0, 50).WithMessage("PhoneNumber can not exceed 50 characters");
RuleFor(x => x.Address).Length(0, 50).WithMessage("Address can not exceed 50 characters");
RuleFor(x => x.Postcode).Length(0, 50).WithMessage("Postcode can not exceed 50 characters");
RuleFor(x => x.City).Length(0, 50).WithMessage("City can not exceed 50 characters");
RuleFor(x => x.Country).Length(0, 100).WithMessage("Country can not exceed 100 characters");
RuleFor(x => x.UserRoleId).NotNull();
}
}
Теперь у меня есть ViewModel, где я хочу использовать эти проверки как таковые:
[Validator(typeof(UserValidator))]
public class RegisterModel
{
public string Email { get; set; }
[DataType(DataType.Password)]
public string Password { get; set; }
[Compare("Password"), Display(Name = "Confirm Password"), DataType(DataType.Password)]
public string ConfirmPassword { get; set; }
public string Name { get; set; }
[Display(Name = "Phone Number")]
public string PhoneNumber { get; set; }
public string Address { get; set; }
public string Postcode { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
Мой класс отличается от того, который используется в AbstractValidator, у меня есть класс RegisterModel.
Когда я бегу, я получаю следующую ошибку:
Невозможно передать объект типа "Web.Models.RegisterModel" для ввода "DAL.User".
... что имеет смысл, поскольку это не тот же тип.
Я также попытался использовать этот способ:
public class RegisterModel
{
[Validator(typeof(UserValidator))]
public User UserDetails { get; set; }
[Compare("Password"), Display(Name = "Confirm Password"), DataType(DataType.Password)]
public string ConfirmPassword { get; set; }
}
Но нельзя использовать в этом, поскольку валидатор является атрибутом уровня класса, а не атрибутом свойства.
Можно ли использовать существующие правила, созданные для моих классов объектов в моделях?
Кто-нибудь пробовал что-то подобное? Или есть другие идеи?
Хорошо - тогда, основываясь на ваших комментариях и EF, создающих для вас классы:
EF создаст частичные классы. Если те, кто живет в пространстве имен "MyProject.Core", просто добавят следующий почти пустой класс в какое-то место и используют одно и то же пространство имен:
public partial class User : IUserModel
{
/* nothing goes in here */
}
public interface IUserModel
{
/*all common properties go here*/
}
Атрибуты [Обязательные] и т.д. Могут работать только на модели (View), а не на интерфейсе.
Затем вы должны настроить свой шаблон T4, чтобы не использовать "Пользователь", но "IUserModel",
Очевидно, одним из решений было бы наследовать класс User:
[Validator(typeof(UserValidator))]
public class RegisterModel : User
{
[Compare("Password"), Display(Name = "Confirm Password"), DataType(DataType.Password)]
public string ConfirmPassword { get; set; }
}
Это имеет смысл, если модель регистрации расширяет пользователя.