ASP.NET MVC ModelState всегда действителен с Fluent Validation

Я пытаюсь использовать плавную проверку с проектом ASP.NET MVC. Я пытаюсь проверить свою модель представления.

Это моя модель просмотра,

[Validator(typeof(ProductCreateValidator))]
public class ProductCreate
{
    public string ProductCategory   { get; set; }
    public string ProductName       { get; set; }
    ....
}

Это мой класс валидатора,

public class ProductCreateValidator : AbstractValidator<ProductCreate> 
{
    public ProductCreateValidator()
    {
        RuleFor(product => product.ProductCategory).NotNull();
        RuleFor(product => product.ProductName).NotNull();
    }
}

И в своем контроллере я проверяю, действительно ли мое ModelState или нет,

[HttpPost]
public ActionResult Create(ProductCreate model)
{
    /* This is a method in viewmodel that fills dropdownlists from db */
    model.FillDropDownLists();

    /* Here this is always valid */
    if (ModelState.IsValid)
    {
        SaveProduct(model);
        return RedirectToAction("Index");
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

Это то, что у меня есть. Моя проблема в том, что ModelState.IsValid возвращает true, когда моя модель просмотра полностью пуста. Нужно ли мне вручную настраивать проверку Fluent, чтобы ошибки модели можно было добавлять в ModalState?


person emre nevayeshirazi    schedule 26.07.2012    source источник


Ответы (1)


Как объясняется в документации, убедитесь, что вы добавили следующую строку в свой Application_Start в чтобы поменять местами поставщика метаданных модели аннотаций данных и вместо этого использовать плавную проверку:

FluentValidationModelValidatorProvider.Configure();

Также меня пугает следующий комментарий в вашем действии:

/* This is a method in viewmodel that fills dropdownlists from db */
model.FillDropDownLists();

Модель представления не должна знать, что означает база данных. Поэтому использование таких методов в вашей модели представления - очень неправильный подход.

person Darin Dimitrov    schedule 26.07.2012
comment
ты очень понравился. Что касается моделей просмотра, у меня есть несколько выпадающих списков, и я хочу, чтобы они заполнялись из базы данных. Какой подход я могу использовать, чтобы заполнить эти альтернативы моему текущему? - person emre nevayeshirazi; 26.07.2012
comment
Я бы просто хотел, чтобы докладчик был вызван контроллером. Выступающий несет ответственность за вызов базы данных для создания модели просмотра и заполнения списков. В более сложном сценарии у вас также может быть средство сопоставления для создания модели просмотра из модели или модели из модели просмотра. Во всех случаях модель представления должна знать только о себе, следуя шаблону POCO, в котором ссылаются только на примитивные типы. - person Samuel; 31.07.2012