Сообщения об ошибках xVal появляются дважды - PullRequest
1 голос
/ 07 августа 2009

Я пытаюсь настроить xVal с проектом ASP.NET MVC 2 Preview 1. Я в основном следую примеру на http://blog.codeville.net/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/ до буквы (пока только на стороне сервера).

Я аннотировал сущность BlogPost, и вот действие Post:

[HttpPost]
public ActionResult Index(BlogPost b)
{
    try
    {
        _blogService.Insert(b);
    }
    catch (RulesException ex)
    {
        ex.AddModelStateErrors(ModelState, "");
    }

    return (View(b));
}

А вот и метод обслуживания:

public void Insert(BlogPost post)
{
    var errors = DataAnnotationsValidationRunner.GetErrors(post);
    if(errors.Any())
    {
        throw new RulesException(errors);
    }

    _blogRepo.Insert(post);
}

(Обратите внимание, что DataAnnotationsValidationRunner дословно взят из примера блога). Когда я отправляю совершенно неверную форму BlogPost, я получаю этот список ошибок проверки:

  • Требуется значение.
  • Пожалуйста, введите название
  • Пожалуйста, введите опубликованную дату
  • Пожалуйста, введите контент
  • Пожалуйста, введите название
  • Пожалуйста, введите опубликованную дату
  • Пожалуйста, введите контент

Я даже не знаю, для чего предназначено первое сообщение, но, как вы можете видеть, другие ошибки появляются дважды. Что я делаю неправильно? Или это проблема с MVC V2?

1 Ответ

1 голос
/ 09 августа 2009

Начиная с ASP.Net MVC 2 Preview 1, теперь мы получаем поддержку проверки DataAnnotation из коробки, поэтому я предполагаю, что ваша проблема в том, что при запуске логики ModelBinder она применяет правила DataAnnotation:

public ActionResult Index(BlogPost b) //Create BlogPost object and apply rules

и затем с вашей логикой XVal вы снова запрашиваете проверку:

var errors = DataAnnotationsValidationRunner.GetErrors(post);

Это подтверждается тем фактом, что они повторяются в одном и том же порядке.

Ваш код работал бы нормально в версии 1 MVC, так как public ActionResult Index (BlogPost b) не будет запускать правила DataAnnotation. Я нигде не читал, если есть возможность отключить новую логику DataAnnotation и просто использовать XVal.

Подробнее об этом можно узнать на Предварительный просмотр сообщения Скотта 1

Чтобы выяснить, что является первым элементом, выполнить debug и проверить, какие ошибки есть в ModelState, поскольку это скажет вам, с каким свойством объекта связаны ошибки.

[HttpPost]
public ActionResult Index(BlogPost b)
{
    try
    {
        _blogService.Insert(b); //Add breakpoint here and check ModelState
    }
    catch (RulesException ex)
    {
        ex.AddModelStateErrors(ModelState, "");
    }

    return (View(b));
}
...