Проверка MVC с другой ViewModel

1

Я написал шаблон 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; }
}

Но нельзя использовать в этом, поскольку валидатор является атрибутом уровня класса, а не атрибутом свойства.

Можно ли использовать существующие правила, созданные для моих классов объектов в моделях?

Кто-нибудь пробовал что-то подобное? Или есть другие идеи?

  • 1
    Чего ты хочешь достичь? Если вы хотите повторно использовать класс UserValidator, я бы посоветовал вам не ожидать класса «Пользователь» в качестве универсального типа, а интерфейс IUser, который определяет свойства, общие для обоих. Похоже, что у реального пользователя есть больше / разные свойства (например, UserRoleId), которые вы можете добавить к другому интерфейсу и в проверке валидатора для этих других интерфейсов и выполнить пользовательскую проверку, например, для идентификатора роли пользователя.
  • 0
    Я хочу использовать те же валидаторы для класса модели, не переписывая их, и, если возможно, было бы хорошо, если бы я мог дать какие-либо дополнительные атрибуты также его свойствам. Большинство из них будут общими, но да, UserRoleId не будет указан в представлении, следовательно, будет отображаться ошибка, которую я не хочу. Не могу пойти с интерфейсами или изменить класс сущности, как его генерирует EF.
Теги:
asp.net-mvc
fluentvalidation

2 ответа

1

Хорошо - тогда, основываясь на ваших комментариях и EF, создающих для вас классы:

EF создаст частичные классы. Если те, кто живет в пространстве имен "MyProject.Core", просто добавят следующий почти пустой класс в какое-то место и используют одно и то же пространство имен:

public partial class User : IUserModel
{
    /* nothing goes in here */
}

public interface IUserModel
{
   /*all common properties go here*/
}

Атрибуты [Обязательные] и т.д. Могут работать только на модели (View), а не на интерфейсе.

Затем вы должны настроить свой шаблон T4, чтобы не использовать "Пользователь", но "IUserModel",

1

Очевидно, одним из решений было бы наследовать класс User:

[Validator(typeof(UserValidator))]
public class RegisterModel : User
{
    [Compare("Password"), Display(Name = "Confirm Password"), DataType(DataType.Password)]
    public string ConfirmPassword { get; set; }
}

Это имеет смысл, если модель регистрации расширяет пользователя.

  • 0
    Как правило, вы не хотите, чтобы ваши модели представлений наследовали ваши модели сущностей.
  • 0
    @CodeCaster: Я вообще не хочу, чтобы мои модели представлений имели что-то общее с моделями сущностей, включая валидаторы, и все же мы здесь с вопросом, заданным Umair. Это решение его проблемы. Если бы это было сделано правильно, не было бы этого вопроса на первом месте.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню