ASP.NET MVC 5 응용 프로그램에서 작업 중이며 프로젝트 소유자는 nullable이 아닌 형식의 유효성 검사로 인해 발생하는 "게시 부족"문제에 대해 우려하고 있습니다. (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에 언급 된대로).nullable 유형 (Int32)에 대한 ASP.NET MVC 5 모델 유효성 검사
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
이 게시물에 null의 경우, 모델에서 그 값 (contact
)은 0이됩니다. 그러나 ModelState.IsValid는 0이됩니다. lso는 입니다. (대신이 두 개의 기사에 나와 있습니다).
내가 무엇을 가지고 :
두 번째 기사는 보여 주었다 무엇 :
내가 ASP.NET에서 어떻게 작동하는지 모델 검증의 변경에 관한 정보를 찾을 수 없습니다 MVC, 그래서 나는 내 테스트 케이스에 뭔가 잘못했다고 생각한다. 어떤 생각이나 제안도 환영합니다.
'int' 속성은'(필수)'속성을 필요로하지 않습니다. (사용자 정의 에러 메시지를 원하지 않는다면)'int'는 결코'null'이 될 수 없습니다. 'DefaultModelBinder'는'int'에'null'을 할당 할 수없고'ModelState.IsValid = false'를 설정하기 때문에 오류를 추가합니다. 하지만 그 값은'int'의 기본값 인'0'입니다. –
@StephenMuecke 그게 처음에 생각한 것입니다. 그러나 브래드 윌슨 (나의 질문에 첫 번째 링크) 게시물에 따르면 : _ 이것의 off-shoot는 nullable 값 유형에 대한 [Required]는 폼에 값이 포함되었음을 보증 할 수 없다는 것입니다. 값이 포함되어 있지 않으면 모델 바인딩이 생략되므로 모델 바인딩 오류가 발생하지 않습니다. 또한 [필수] 유효성 검사기를 실행하면 값 유형 기본값 (일반적으로 0)이 포함될 모델에서 값을 쿼리하고 "null이 아니며 모든 것이 모두 여기에 적합합니다!" – Jim
틀렸고 모델 바인딩을 건너 뛰지 않았습니다. 값 유형이거나'[Required]'속성을 가진 참조 타입 인 경우에는 'ModelState.IsValid'가 항상 false가됩니다. –