Почему проверка на стороне сервера не работает в моем приложении ASP.Net MVC3 с Entity Framework?

У меня есть приложение ASP.NET MVC3, которое использует объекты, созданные из базы данных. У каждой сущности также есть отдельный разделяемый класс, который использует атрибут MetadataType для связывания каждой сущности с классом, снабженным рядом атрибутов проверки (см. ниже).

[MetadataType(typeof(Drawing.Metadata))]
public partial class Drawing
{
    private sealed class Metadata
    {
        [Required]
        [StringLength(50, MinimumLength = 3, ErrorMessage = "Drawing numbers must be between {2} and {1} characters in length.")]
        [DisplayName("Drawing number")]
        public string Number { get; set; }

        [Required]
        [StringLength(255, MinimumLength = 3, ErrorMessage = "Drawing titles must be between {2} and {1} characters in length.")]
        public string Title { get; set; }
    }
}

Мой код контроллера выглядит так:

[HttpPost]
public ActionResult Create(Drawing drawing)
{
    if (ModelState.IsValid)
    {
        // Save to database here...
        return RedirectToAction("Index");
    }
    else
    {
        return View(drawing);
    }
}

Я использовал шаблоны Visual Studio для создания представлений для добавления, редактирования и удаления объектов (код дизайнера не был изменен).

Проблема, с которой я сталкиваюсь, заключается в том, что при создании объекта проверка работает только в том случае, если у меня включена проверка на стороне клиента. Если я отключу проверку на стороне клиента, то ModelState.IsValid всегда будет возвращать значение true и вернет меня на страницу индекса.

Может ли кто-нибудь дать какие-либо предложения о том, как заставить проверку на стороне сервера работать с объектами Entity Framework?

ОБНОВЛЕНИЕ:

Кажется, этот вопрос похож на мой. Автор этого поста, похоже, решил проблему, но, скорее, бесполезно не упомянул, как они решили проблему...


person Benjamin Gale    schedule 11.11.2011    source источник
comment
Пожалуйста, покажите свой код: модель/контроллер/представление.   -  person Darin Dimitrov    schedule 11.11.2011


Ответы (2)


Я нашел другое решение этой проблемы. Поскольку я действительно не хотел устанавливать для своих свойств значение nullable, я добавил следующее:

[DisplayFormat(ConvertEmptyStringToNull = false)]

Добавление следующей аннотации к свойству модели также устраняет ошибку.

person Christophe De Troyer    schedule 05.08.2012
comment
+1 за ответ на вопрос, несмотря на то, что на него уже был принят ответ. Я принял это вместо своего ответа, так как, на мой взгляд, это гораздо лучшее решение (я также действительно не хотел, чтобы мои свойства обнулялись). Спасибо. - person Benjamin Gale; 05.08.2012

После дальнейшего изучения кажется, что моя проблема возникает из-за ConstraintException, выбрасываемого моим классом сущности (который наследуется от ObjectContext), когда связыватель модели по умолчанию пытается связать пользователя входные значения (в данном случае Null) в свойства объекта.

Я вижу 2 возможных решения этой проблемы:

  1. Ослабьте ограничения на таблицы моей базы данных (я не хочу этого делать).
  2. Сделайте поля сущностей обнуляемыми (используйте конструктор сущностей, задав для свойства обнуляемость значение yes)

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

Изучая решения этой проблемы, я пришел к выводу, что проблема связана с тем, что мои объекты наследуются от ObjectContext, который является довольно тяжелым классом. Я нашел много руководств, в которых использовался подход «сначала код». В этом случае класс сущности будет наследоваться от DbContext, который намного легче, поэтому я думаю, что это можно рассматривать как третье решение проблемы.

person Benjamin Gale    schedule 21.11.2011