Почему fluent.validate вызывает исключение в asp.net mvc - PullRequest
0 голосов
/ 21 марта 2011

Я хочу переопределить проверку asp.net-mvc по умолчанию при публикации формы , поэтому я попытался использовать fluent.validation

Я создал класс валидатора (ProjectValidator)

public class ProjectValidator : AbstractValidator<Project>
{
    public ProjectValidator()
    {
        RuleFor(h => h.Application).NotNull().WithName("Application");
        RuleFor(h => h.FundingType).NotNull().WithName("Funding Type");
        RuleFor(h => h.Description).NotEmpty().WithName("Description");
        RuleFor(h => h.Name).NotEmpty().WithName("Project Name");
    }
}

я помещаю атрибут в свой класс объектов передачи данных

[Validator(typeof(ProjectValidator))]
  public class ProjectViewModel
  {
      ...
  }

и помещаю его в application_start ();

 DataAnnotationsModelValidatorProvider
            .AddImplicitRequiredAttributeForValueTypes = false;

 ModelValidatorProviders.Providers.Add(
            new FluentValidationModelValidatorProvider(new AttributedValidatorFactory()));

, но когда я публикую форму, которая используетэтот объект, я получаю следующую ошибку:

Метод не найден: 'System.Collections.Generic.IEnumerable`1 FluentValidation.IValidatorDescriptor.GetValidatorsForMember (System.String)'.

есть предложения?

1 Ответ

2 голосов
/ 21 марта 2011

Это может быть проблема, связанная с версиями сборки, которые вы используете. Вот шаги, которые работают для меня с последней версией FluentValidation.NET и ASP.NET MVC 3:

  1. Создайте новый проект ASP.NET MVC 3, используя шаблон Visual Studio по умолчанию.
  2. Установите пакет FluentValidation.MVC3 NuGet.
  3. Добавьте модель представления и соответствующий ей валидатор (обратите внимание, что в вашем случае у вас есть валидатор для типа Project - AbstractValidator<Project>, тогда как ваша модель представления называется ProjectViewModel, что является несовместимым. Валидатор должен быть связан с моделью представления):

    public class ProjectValidator : AbstractValidator<ProjectViewModel>
    {
        public ProjectValidator()
        {
            RuleFor(h => h.Application).NotNull().WithName("Application");
            RuleFor(h => h.FundingType).NotNull().WithName("Funding Type");
            RuleFor(h => h.Description).NotEmpty().WithName("Description");
            RuleFor(h => h.Name).NotEmpty().WithName("Project Name");
        }
    }
    
    [Validator(typeof(ProjectValidator))]
    public class ProjectViewModel
    {
        public string Application { get; set; }
        public string FundingType { get; set; }
        public string Description { get; set; }
        public string Name { get; set; }
    }
    
  4. В Application_Start зарегистрируйте валидатор:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    
        DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
        ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new AttributedValidatorFactory()));
    }
    
  5. Определить контроллер:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new ProjectViewModel());
        }
    
        [HttpPost]
        public ActionResult Index(ProjectViewModel model)
        {
            return View(model);
        }
    }
    
  6. И вид:

    @model Appame.Models.ProjectViewModel
    
    @using (Html.BeginForm())
    {
        <div>
            @Html.LabelFor(x => x.Application)
            @Html.EditorFor(x => x.Application)
            @Html.ValidationMessageFor(x => x.Application)
        </div>
        <div>
            @Html.LabelFor(x => x.FundingType)
            @Html.EditorFor(x => x.FundingType)
            @Html.ValidationMessageFor(x => x.FundingType)
        </div>
        <div>
            @Html.LabelFor(x => x.Description)
            @Html.EditorFor(x => x.Description)
            @Html.ValidationMessageFor(x => x.Description)
        </div>
        <div>
            @Html.LabelFor(x => x.Name)
            @Html.EditorFor(x => x.Name)
            @Html.ValidationMessageFor(x => x.Name)
        </div>
    
        <input type="submit" value="OK" />
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...