Валидация не работает по длине - PullRequest
5 голосов
/ 17 января 2011

Я пытаюсь заставить Fluent Validation правильно работать на моей стороне клиента. Я использую ASP.NET MVC 3.

У меня есть заголовок, который должен быть от 1 до 100 символов. Поэтому, пока я печатаю в заголовке, отображается сообщение об ошибке, которого нет в моем наборе правил. Вот мой набор правил:

RuleFor(x => x.Title)
   .NotEmpty()
   .WithMessage("Title is required")
   .Length(1, 100)
   .WithMessage("Title must be less than or equal to 100 characters");

Вот сообщение об ошибке, которое отображается:

Please enter a value less than or equal to 100

Я не уверен, что я делаю неправильно. Вот мой global.asax:

// FluentValidation
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

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

ModelMetadataProviders.Current = new FluentValidationModelMetadataProvider(
   new AttributedValidatorFactory());

1 Ответ

12 голосов
/ 17 января 2011

Работает нормально для меня.Вот шаги:

  1. Создание нового RTM-проекта ASP.NET MVC 3 с использованием шаблона Visual Studio по умолчанию
  2. Загрузка последней FluentValidation.NET
  3. Ссылка на сборки FluentValidation.dll и FluentValidation.Mvc.dll (будьте осторожны, внутри .zip есть две папки: MVC2 и MVC3, поэтому убедитесь, что вы выбрали правильную сборку)

Добавьте модель:

[Validator(typeof(MyViewModelValidator))]
public class MyViewModel
{
    public string Title { get; set; }
}

и соответствующий валидатор:

public class MyViewModelValidator : AbstractValidator<MyViewModel>
{
    public MyViewModelValidator()
    {
        RuleFor(x => x.Title)
           .NotEmpty()
           .WithMessage("Title is required")
           .Length(1, 5)
           .WithMessage("Title must be less than or equal to 5 characters");
    }
}

Добавить к Application_Start:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

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

ModelMetadataProviders.Current = new FluentValidationModelMetadataProvider(
    new AttributedValidatorFactory());

Добавить контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

и соответствующий вид:

@model SomeApp.Models.MyViewModel
@{
    ViewBag.Title = "Home Page";
}
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
    @Html.TextBoxFor(x => x.Title)
    @Html.ValidationMessageFor(x => x.Title)
    <input type="submit" value="OK" />
}

Теперь попробуйте отправить форму, оставив ввод заголовка пустым => проверка на стороне клиента активируется и на экране появится сообщение Заголовок требуется .Теперь начните вводить текст => сообщение об ошибке исчезнет.После того, как вы введете более 5 символов в поле ввода, заголовок должен быть меньше или равен 5 символам появится сообщение проверки.Так что все, кажется, работает как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...