2010-04-01 4 views
0

ASP.NET MVC 2에서 작동하도록 유효성을 검사하려고하지만 많은 성공을 얻지 못했습니다.ViewModel Validation 내에서 캡슐화 된 ASP.NET MVC 2 모델

많은 수의 필드가 포함 된 복잡한 클래스가 있습니다. (묻지 말아라 - 이것은 실세계의 베스트 프랙티스가 만질 수없는 것들 중 하나이다.) 이것은 보통 나의 모델 일 것이고 LINQ-to-SQL 생성 클래스이다.

생성 된 코드이므로 http://davidhayden.com/blog/dave/archive/2009/08/10/AspNetMvc20BuddyClassesMetadataType.aspx에 따라 MetaData 클래스를 만들었습니다.

public class ConsultantRegistrationMetadata 
{ 

    [DisplayName("Title")] 
    [Required(ErrorMessage = "Title is required")] 
    [StringLength(10, ErrorMessage = "Title cannot contain more than 10 characters")]  
    string Title { get; set; } 

    [Required(ErrorMessage = "Forename(s) is required")] 
    [StringLength(128, ErrorMessage = "Forename(s) cannot contain more than 128 characters")] 
    [DisplayName("Forename(s)")] 
    string Forenames { get; set; } 
     // ... 

내 생성 된 클래스의 부분 클래스에이 첨부했습니다 :

내 양식이 복잡하기 때문에, 그런 내가 가지고있는 등 SelectLists, 같은 종속성을 가지고 있습니다
[MetadataType(typeof(ConsultantRegistrationMetadata))] 
public partial class ConsultantRegistration 
{ 
    // ... 

의 ViewModel 패턴에 캡슐화 - 그리고 속성으로 ConsultantRegistration 모델 포함 :

public class ConsultantRegistrationFormViewModel 
{ 
    public Data.ConsultantRegistration ConsultantRegistration { get; private set; } 

    public SelectList Titles { get; private set; } 
    public SelectList Countries { get; private set; } 
// ... 

그래서 기본적으로 뷰 모델 => 모델

입니다

내보기는 다음과 같습니다

<p> 
     <%: Html.LabelFor(model => model.ConsultantRegistration.Title) %> 
     <%: Html.DropDownListFor(model => model.ConsultantRegistration.Title, Model.Titles,"(select a Title)") %> 
     <%: Html.ValidationMessage("Title","*") %> 
    </p> 

    <p> 
     <%: Html.LabelFor(model => model.ConsultantRegistration.Forenames) %> 
     <%: Html.TextBoxFor(model => model.ConsultantRegistration.Forenames) %> 
     <%: Html.ValidationMessageFor(model=>model.ConsultantRegistration.Forenames) %> 
    </p> 

문제는, 검증은 효과가없는있는 메타 데이터 클래스 속성. 인터페이스를 통해 시도했지만 효과가 없습니다. 그 이유는 ViewModel 내 모델을 캡슐화하기 때문이라고 생각하기 시작했습니다. 다음과 같이

내 컨트롤러 (활동 작성)입니다 : 주석에 설명 된대로

[HttpPost] 
     public ActionResult Create(Data.ConsultantRegistration consultantRegistration) 
     { 
      if (ModelState.IsValid) // this is always true - which is wrong!! 
      { 
       try 
       { 

        consultantRegistration = ConsultantRegistrationRepository.SaveConsultantRegistration(consultantRegistration); 

        return RedirectToAction("Edit", new { id = consultantRegistration.ID, sectionIndex = 2 }); 
       } 
       catch (Exception ex) 
       { 
        ModelState.AddModelError("CreateException",ex); 
       } 
      } 

      return View(new ConsultantRegistrationFormViewModel(consultantRegistration)); 

     } 

에서, ModelState.IsValid 속성은 항상 Validaiton 주석이 유효없는과 필드에도 불구하고, true를 돌려줍니다. (Forenames는 중요한보기이다).

내가 MVC 초보자 인 것을 고려해 볼 때 분명하지 않은 점이 있습니까? 나는 Jon Galloway가 http://www.asp.net/learn/mvc-videos/video-10082.aspx에 demoed 메커니즘을 쫓았습니다.

(나는 그것이 무엇인지 전혀 모른다하고 MVC 하나입니다 생각한다. 암 인식 t은 ASP.NET MVC Model/ViewModel Validation 비슷하지만 해당 게시물이 경우 xval에 대해 이야기하는 것 같습니다) 나는이 작품을 만들기 위해 노력했습니다

답변

1

언젠가는. 당신이 포함시킨 코드에 기반하여 나는 당신이 올바르게하고 있다고 생각합니다.

나는이 문제가 페이지에 "방출"될 것으로 예상되는 자바 스크립트 검사기와 같다고 생각합니다. 이 문제와 관련하여 여기에 몇 가지 다른 질문이 있습니다. 그 중 어떤 것도 솔루션을 제공하지 않는다고 생각합니다. 내가 알 수있는 한, MVC2 RC는 여전히 고장났습니다.

UPDATE :

당신이 방출 된 코드에 속성을 적용 할 때 작동하는 경우

이, 이것 좀보세요 :

When using Data Annotations with MVC, Pro and Cons of using an interface vs. a MetadataType

그것은 작동하지 년대 MetadataType 속성을 수 있습니다. 위의 질문에서 제안한대로 인터페이스를 사용해도 작동합니까?또한

, 또 다른 질문 하나는 비교적 최근이며,이 여전히 MVC2에서 버그가 있음을 확인 MetadataType and client validation in ASP.NET MVC 2

있다.

+0

아, 훌륭합니다. LINQ-to-SQL으로 생성 된 코드에 직접 특성을 적용하면 작동합니다 (JS는 아니지만 절반은 유효합니다). 분명히 해결책이 아닙니다. –

+0

업데이트 답변 ... –

+0

감사합니다. Dave. 나는 수요일까지 일을 끝내고 나서 좀 기다려야 할 것이다. 그러나 주목 받았다. –