Аннотация данных MVC — обязательное поле не работает

#asp.net-mvc #linq #data-annotations

#asp.net-mvc #linq #данные-аннотации

Вопрос:

Привет, у меня есть следующий код в моем приложении, но только с двумя полями он не работает.

 [Required]        
public string DevelopmentPM { get; set; }
  

Выполняется и проходит следующий тест:

     [TestMethod]
    public void SiteConstruction_MODEL_DevelopmentPM_Is_Required()
    {
        //arrange
        var propertyInfo = typeof(SiteConstructionMetadata).GetProperty    
                           ("DevelopmentPM");

        //act
        var attribute = propertyInfo.GetCustomAttributes(typeof(RequiredAttribute), 
                        true).Cast<RequiredAttribute>().FirstOrDefault();

        //assert
        Assert.IsNotNull(attribute);
    }
  

Мой контроллер выглядит следующим образом:

         TryUpdateModel(siteConstruction);

        if (!ModelState.IsValid)
           return View(siteConstruction);
  

У меня есть другие обязательные поля в модели, и они в порядке. Это поле равно нулю (я проверил), но не делает модель недействительной — поэтому проверка не выполняется и при сохранении выдается ошибка.

Мое мнение

     <li>
        <label for="DevelopmentPM">
            <strong>Development PM:</strong></label>
        <%= Html.TextBox("DevelopmentPM") %>
        <%= Html.ValidationMessage("DevelopmentPM", "*") %>
    </li>
  

Я просмотрел my .dbml (Linq to SQl), правописание выглядит нормально.

Я упускаю что-то простое — пожалуйста, схожу с ума.

Спасибо

Дэви

Ответ №1:

[MetadataType(typeof(SiteConstructionMetadata))] над моим частичным классом я считал само собой разумеющимся, что он у меня там есть.

В следующий раз, вместо публикации фрагментов, я думаю, что опубликую все — все мы заметили это довольно быстро.

Дэви

Ответ №2:

Убедитесь, что вы также создаете DataAnnotationsModelBinder привязку модели по умолчанию. Добавьте следующее в свой Global.asax.cs :

 ModelBinders.Binders.DefaultBinder = new Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder();
  

и убедитесь, что вы ссылались на System.ComponentModel.DataAnnotations.dll сборку в своем проекте. Смотрите этот учебник для получения более подробной информации.

Комментарии:

1. Спасибо — нет, у меня это есть — как я уже сказал — этот точный код работает в другом месте. Я отладил, и даже если я явно установлю для этого поля значение null в контроллере — модель все еще действительна.