#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 в контроллере — модель все еще действительна.