2011-02-23 5 views
0

내 EditorTemplate (문자열)에서 Label 및 Required 메타 데이터를 컨트롤에 설정하는 확장 메서드가 있습니다. (그래서 내 모델에 주석을 달 수 없어 이것이 내가이 일을하는 이유이다).ASP.NET MVC - 프로그래밍 방식으로 ModelMetadata.IsRequired를 설정 한 후에 ModelState.IsValid가 true를 반환하는 이유는 무엇입니까?

public static void SetMetadata(this ViewUserControl control) 
    { 
     if (!string.IsNullOrEmpty((string)control.ViewData["labeltext"])) 
      control.ViewData.ModelMetadata.DisplayName = (string)control.ViewData["labeltext"]; 

     if (control.ViewData["required"] != null) 
      control.ViewData.ModelMetadata.IsRequired = (bool)control.ViewData["required"]; 
    } 

는 사람이 ModelState.IsValid이 필드를 따기되지 왜 어떤 아이디어는 내가 필수 = 사실로 설정 한 가지고있다?

+1

왜 뷰 모델에 주석을 달 수 없습니까? –

+0

@ chad-ruppert 모델은 웹 서비스에서 오는 비즈니스 엔티티이며 프록시 클래스에만 액세스 할 수 있습니다. – kiwiaddo

답변

3

여기에서 문제는 페이지의 get 요청에서 ModelMetadata을 수정한다는 것입니다. 이 정보는 post 작업 (MVC에는 ViewState esque 메커니즘이 없기 때문에)에서 지속됩니다.

유효성 검사를 시도하는 클래스가 partial으로 표시되어 있습니까? 이 경우 유효성 검사 속성, 당신은 클래스를 장식하는 멋진 MetadataType 속성을 사용할 수 있습니다 :이 "일회용"(JobOpening_Validation) 클래스를 사용

[MetadataType(typeof(JobOpening_Validation))] 
public partial class JobOpening 
{ 
    //JobOpening is generated by LinqToSql but I want to validate the Title Property 
} 

internal class JobOpening_Validation 
{ 
    [Required] 
    [StringLength(150, ErrorMessage = "Must be under 150 characters")] 
    public string Title { get; set; } 
} 

우리는 우리가 "대상"에서 검증하고자하는 동일한 속성을 만들 (JobOpening) 수업. "throwaway"클래스의 속성을 꾸미면 "target"클래스에 복사됩니다.

이 방법으로 문제가 해결되지 않으면 FilterAttribute을 만들고 OnActionExecuting 메서드를 재정 의하여 거기에서 모델의 유효성 검사를 수행 할 수 있습니다. 그에 따라 모델 상태를 업데이트 할 수도 있습니다.

+0

@ nathan-anderson 의견을 보내 주셔서 감사합니다. 이것은 합리적인 접근법처럼 들리지만, 내가했던 것만은 아닙니다. 웹 서비스에서 오는 프록시 클래스이므로보기 모델을 마크 업하지 않으려합니다. 어쩌면 MVC 확장 - 메타 데이터를 수정하는 구성을 사용하는 것이 최선의 방법 일 것입니다. – kiwiaddo

+0

게시물의'ActionMethod'를 통해'EditorTemplate'에서 설정 한 메타 데이터에 접근 할 수있는 방법이 있습니까? – kiwiaddo

+0

'FilterAttribute' 옵션과 달리 메타 데이터 자체를 게시하고 해석 형식을 수행하지 않고 제안했습니다. –

0

MvcExtensions를 사용하여 실험 한 후 - 내 프로젝트에 구형 화하기가 너무 어렵 기 때문에 실패했습니다. 나는 화려한 프로젝트를 찾지 못했습니다. Fluent Validation

MVC와 함께 사용하기 쉽고 쉽게 통합되었습니다.