2009-04-19 8 views
8

MVC 사용자 정의 뷰 모델 및 바인딩 자동 :나는 사용자 정의 뷰 모델과 같이 정의

:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(SampleFormViewModel model) 
{ 

편집 양식은 다음과 같이 설정 : 내 편집 POST 처리기에서

public class SampleFormViewModel 
{ 
    public SampleFormViewModel(SelectList companies, Widget widget) 
    { 
     Companies = companies; 
     Widget = widget; 
    } 

    public SelectList Companies { get; private set; } 
    public Widget Widget { get; private set; } 
} 

나는 다음과 같은 항목이

Inherits="System.Web.Mvc.ViewPage<Sample.Web.Models.SampleFormViewModel>" 

그리고 그냥 무슨 일이 일어나고 있는지 확실하지 않아 다음 오류가 있습니다. 아니요 p 이 객체에 대해 정의 된 무작위 생성자. 확실한 것은 여기에 정말 분명한 것을 놓치고 있습니다. 일부 배경, GET 완벽하게 작동하고 예상대로 SelectList에서 드롭 다운을 표시합니다. 커스텀 뷰 모델에 자동으로 다시 바인딩하는 것이 무엇이 실패했는지에 대해 확신하지 못합니다.

+0

게시 할 양식은 어떤 모양입니까? –

답변

8

매개 변수가없는 생성자가 필요하며 속성에 공개 setter가 있어야한다고 생각합니다. 기본 바인더는 매개 변수를 사용하지 않는 생성자를 사용하여 개체를 만든 다음 공용 속성의 리플렉션을 사용하여 양식/쿼리 매개 변수의 값을 설정합니다.

public class SampleFormViewModel 
{ 
    public SampleFormViewModel() { } 

    public SelectList Companies { get; set; } 
    public Widget Widget { get; set; } 
} 

나는, 그래도 의심이 정말보기 모델을 얻을하지 않습니다 싶은,하지만 그 기본 위젯 모델 및 양식 게시물에 선택 목록 값입니다. 나는 바인더가 단지 매개 변수에서 선택된 값을 가지고 있기 때문에 포스트상에서 SelectList를 재구성 할 수있을 것이라고 생각하지 않는다.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int CompanyID, Widget widget) 
{ 
} 
+0

네, 지금 받으십시오. 문제는 SelectList에 매개 변수없는 생성자가 없다는 것입니다. 생성자에서 SelectList (Companies)를 제거하면 어떻게됩니까? 그리고 예상대로 ViewModel을 만들면 즉석에서 (위젯 객체의 정보에서) 빌드하십시오. 차이점은 POST에서 처리하는 방법입니다. 이제는 서명이 있습니다. public ActionResult Edit (int id, FormCollection formValues) –

2

강력한 형식의 뷰에서 MVC는 뷰가 해당 뷰에서 사용되는 클래스를 만들 수 있어야합니다. 이것은 매개 변수가없는 생성자를 의미합니다. 그리고 이것은 의미가 있습니다. MVC를 처음 접하는 사람들도 비슷한 "허?" 매개 변수를 잊어 버렸거나 실패했을 때 발생하는 문제와 뷰가 자체적으로 (컴파일러 오류가 아니라) 놓을 때 나타나는 팝업과 같은 모든 관련 오류.

그러나 매개 변수없는 생성자 문제의이 클래스에서 "재미있는"것은 클래스의 속성에도 매개 변수가없는 생성자가없는 경우입니다. 이것은 비관적 인 접근이라고 생각하십니까?

MVC 고유의 클래스 인 SelectList 클래스에서 약간의 학습 시간을 보냈을 때 일부 사람들이 몇 분/시간을 절약하는 데 도움이되고 싶었습니다.

드롭 다운 목록 작성을위한이 정말 중요한 도구/클래스, 다음과 같은 생성자가 있습니다

공공 selectList의을 (를 IEnumerable 항목); 공용 SelectList (IEnumerable items, object selectedValue); 공용 SelectList (IEnumerable items, string dataValueField, string dataTextField); 공용 SelectList (IEnumerable 항목, 문자열 dataValueField, 문자열 dataTextField, 개체 selectedValue);

. 따라서 클래스에있는 속성 (보기에 사용 된 속성) 인 경우 MVC는 "매개 변수없는 생성자 없음"오류를 알려줍니다.

그러나 헬퍼 클래스와 같은 것을 만들면 원래 클래스의 정확한 코드를 잘라내어 원래 클래스의 매개 변수 (get/set이 아님)로 만듭니다. 너는 가야 돼.

이렇게하면 가져 오기와 글에 대한 단일보기를 사용할 수 있습니다.어떤 더 아름답습니다 :

개인적으로, 나는 연관성과 강력한 형식화 된 뷰의 요구 사항을 인식하도록 컴파일러를 만들었거나 드롭 다운 (또는 SelectList의 다른 "고객")이 오히려 작동하지 않게했습니다. paramerterless 생성자에 대한 재귀 적 검사의 특정 수준이 있는지 궁금합니다.

다행히도 현재 버전은 최상위 수준 인 것 같습니다. 해킹과 같은 느낌이 들며 디자인 상 바란다.

HTH.

+1

선택 목록의 도우미 클래스에 대한 설명을 코드 예제로 자세히 설명해 주시겠습니까? – camainc