ASP.NET MVC에서 서버 측 유효성 검사를 위해 데이터 주석을 사용하기 위해 DataAnnotationsModelBinder을 사용하려고합니다. 같은DataAnnotationsModelBinder는 사용자 정의 ViewModels과 어떻게 작동합니까?
public class Foo
{
public class Baz
{
public int Bar {get;set;}
}
public Baz MyBazProperty {get;set;}
}
으로, 복잡한
ViewModel
를 사용하려고 할 때 내 뷰 모델은
그러나
public class Foo
{
public int Bar {get;set;}
}
즉각적인 특성을 가진 단순한 클래스로
다만큼 잘 작동의 DataAnnotationsModelBinder
는 NullReferenceException
원인
형식이 지정되지 않은 ViewData 배열 대신 여러 LINQ 엔터티가 포함 된 사용자 지정 ViewModel
을 사용하는 것이 더 좋기 때문에이 문제는 둘 이상의 LINQ 엔터티를 렌더링하는보기에서 큰 문제입니다. .
DefaultModelBinder
에는이 문제가 없으므로 DataAnnotationsModelBinder
의 버그 인 것 같습니다. 이 문제를 해결할 수있는 방법이 있습니까?
편집 : 가능한 해결 방법은이 같은 뷰 모델 클래스의 자식 객체의 속성을 노출 물론이다
public class Foo
{
private Baz myBazInstance;
[Required]
public string ExposedBar
{
get { return MyBaz.Bar; }
set { MyBaz.Bar = value; }
}
public Baz MyBaz
{
get { return myBazInstance ?? (myBazInstance = new Baz()); }
set { myBazInstance = value; }
}
#region Nested type: Baz
public class Baz
{
[Required]
public string Bar { get; set; }
}
#endregion
}
#endregion
하지만이 모든 여분의 코드를 작성하지 않으려는 것입니다. DefaultModelBinder
같은 hiearchies 함께 잘 작동, 그래서 나는 DataAnnotationsModelBinder
가정해야합니다.
두 번째 편집 : 이것은 실제로 DataAnnotationsModelBinder
의 버그입니다. 그러나 다음 ASP.NET MVC 프레임 워크 버전이 출시되기 전에 이것이 수정 될 수 있기를 바랍니다. 자세한 내용은 this forum thread을 참조하십시오.
나는 비슷한 모델을 가지고 있지만 일반적으로 한 번에 개별 개체를 편집합니다. 예를 들면 : 일련의 첨부 파일 (이미지, PDF)이있을 수도 있고 없을 수도있는 Announcement 개체가 있지만 알림 만 편집하므로 유효성 검사기가 알림의 자식 개체로 내려 가도록 강요하지 마십시오. 그런 다음 자식 개체를 별도로 편집 할 것입니다. 동일한보기이지만 다른 POST 동작입니다. 나는 지금 관심이 있습니다 - 당신의 행동은 어떻게 거대한 대상 나무를 검증하는 것입니까? UI가 어떻게 작동합니까? –
관련 문의 : 나는 http://devermind.com/linq/aspnet-mvc-using-custom-viewmodels-with-post-action-methods에서 이것을 수행하는 방법을 설명했다. 유효성에 관한 : 지금까지 나는 Scott Gu의 자습서 (http://weblogs.asp.net/scottgu/archive/2009/03/10/free-asp-net-mvc-ebook-tutorial.aspx)에 설명 된 것과 같은 방식으로 서버 측 유효성 검사를 사용합니다. 내 컨트롤러는 다음과 같이 다른 엔터티에서 유효성 검사 오류를 수집합니다. ModelState.AddRuleViolations (model.User.GetRuleViolations(), "User"); ModelState.AddRuleViolations (model.Company.GetRuleViolations(), "Company"); –
내 모델 바인더 코드의 어딘가에있는 버그라고 확신하지만, 그것을 추적 할 시간이 없었습니다. 더 많은 결과물이 나왔습니다. : –