Я работаю над приложением ASP.NET MVC 5, а владелец проекта обеспокоен проблемами «недопоставки», вызванными проверкой типов, не допускающих нулевое значение (как указано в http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html и http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api).Проверка модели ASP.NET MVC 5 для типов, не подлежащих обнулению (Int32)
Я создал тестовый пример для репликации этой проблемы в ASP.NET MVC 5, но без везения.
Модель:
public class ContactModel
{
[Required]
public Int32 data1 { get; set; }
public Int32 data2 { get; set; }
}
Вид:
<div class="form-group">
@Html.LabelFor(model => model.data1)
<div>
@Html.EditorFor(model => model.data1)
</div>
</div>
<div>
@Html.LabelFor(model => model.data2)
<div>
@Html.EditorFor(model => model.data2)
</div>
</div>
Контроллер:
public ActionResult Index(Models.ContactModel contact)
{
if (ModelState.IsValid)
{
Response.Write("modelstate is valid<br>");
return View();
}
else
{
Response.Write("modelstate is invalid<br>");
return View();
}
}
Кажется, что когда data1
и data2
являются недействительными в должности, их значения в модели (contact
) будет 0. Однако ModelState.IsValid будет lso be false (вместо true, как показано в двух статьях).
Что у меня есть:
Что второй статье показано:
Я не мог найти какую-либо информацию в отношении изменений о том, как модель проверки работы в ASP.NET MVC, поэтому я предполагаю, что я сделал что-то не так с моим тестовым случаем. Любую мысль и предложение ценят.
Вам не нужен атрибут '[Обязательный]' в свойстве 'int' (если вы не хотите создать собственное сообщение об ошибке) -' int' никогда не может быть 'null'. «DefaultModelBinder» добавляет ошибку, потому что вы не можете назначить 'null' для' int' и устанавливает 'ModelState.IsValid = false'. Но значение равно '0', потому что это значение по умолчанию для' int' –
@StephenMuecke, это то, что я думал изначально. Но согласно сообщению Брэда Уилсона (первая ссылка в моем вопросе): _ Отключение этого - это то, что [Обязательно] по типу с недействительным значением не может служить гарантией того, что форма включала значение. Если он не содержит значения, то привязка модели пропускается, что означает, что сбой привязки модели не произойдет. Кроме того, когда выполняется [Validired] validator, он запрашивает значение из модели, которое будет содержать значение значения по умолчанию, обычно 0 - и говорит «это не null, все здесь хорошо!» ._ – Jim
Это неправильно, и привязка к модели никогда не пропускается. 'ModelState.IsValid' всегда будет false, если значение отправлено для свойства, которое является типом значения или ссылочным типом с атрибутом' [Обязательный] ' –