2010-04-15 6 views
1

일부 공통 속성을 기본 클래스로 리팩터링하고 즉시 모델 업데이트가 실패하기 시작했습니다. UpdateModel() 및 TryUpdateModel()은 상속 된 공용 속성을 업데이트하지 않는 것 같습니다.ASP.NET MVC UpdateModel - 필드 대 속성?

MSDN이나 Google에서 이러한 방법의 규칙이나 의미에 대한 자세한 정보를 찾을 수 없습니다. 문서는 간결 (http://msdn.microsoft.com/en-us/library/dd470933.aspx)이며 간단히 설명하면 다음과 같습니다.

컨트롤러의 현재 값 공급자의 값을 사용하여 지정된 모델 인스턴스를 업데이트합니다.

SOLVED : MVC.NET은 실제로 상속 된 속성을 처리합니다. 이것은 상속과는 아무런 관련이없는 것으로 밝혀졌습니다. 내 기본 클래스는 속성이 아닌 public 필드로 구현되었습니다. 그들을 공식 속성 ({get; set;}을 추가하는 것)으로 바꾸는 것은 내가 필요한 전부였다. 이것은 전에 물기가 있었고, 나는 단순한 공개 필드를 사용하고 싶습니다. 필자는 필드와 속성이 문법적으로 동일하고 클래스의 사용자에게 의미 상 동일하다고 주장 할 수 있다고 주장합니다.

답변

1

MVC는 상속 된 클래스의 속성에 바인딩됩니다. 모델 바인더는 typeof (yourtype) .GetProperties()와 같은 것을 호출합니다. 상속 된 모든 멤버를 반환합니다.

그냥 그것을 밖으로 테스트 :

public class PersonBase 
{ 
    public string Name { get; set; } 
} 

public class User : PersonBase 
{ 
    public string FavoriteFood { get; set; } 
} 

"내 가정이 방법 만이 최고 수준에 반영되어있다"

어떻게 그 일 것? "최상위"클래스도 기본 클래스입니다.

+0

내 문제가 다른 곳에 있었던 것을 확인해 주셔서 감사합니다. 내 편집을 참조하십시오. 예, GetProperties()를 사용하여 반영하는 것이 GetFields()와 반대되는 문제입니다. 모델 바인딩은 공용 속성과 필드를 모두 업데이트 할 것으로 예상 했었습니다. 속성은 필드 표기법으로 가장하는 문법적 설탕이기 때문입니다. 그러나 이것은 MVC.NET 지식이 부족한 것입니다. 내가 알기로, 그 단순함,하지만 나는 차별화를 좋아하지 않습니다. – codenheim

+0

>> "top"클래스도 기본 클래스입니다. 나는 아래쪽을 의미했다, 미안, 빠른 것을 그것에 타이프했다. .. 나는 잎 학급을 말해야했다. – codenheim

1

이 사람도 나에게 호기심을 일으켰다. 는 내가보기에서 호출 WASS이 작업 방법

public ActionResult Edit(Manager manager) 
     { 
      return View(manager); 
     } 

에 다음 (결국, 관리자가 너무 :-) 사람이다)는 Person 에서

를 파생 클래스 Manager에 대한 편집 양식을 만든 Manager (파생 형식)을 강력한 형식의 모델 변수로 사용하여 관리자 변수를 가리키면 기본 클래스가 표시됩니다 (실제로 : base : Person). 관리자의 추가 속성은

입니다. formcollection t 시도 oo, 그게 또한 작동합니다 :

public ActionResult Edit(FormCollection formCollection) 
     { 
      Manager manager = new Manager(); 
      UpdateModel(manager); 
      return View(manager); 
     } 
+0

아, 지금은 formcollection을 사용하고있을뿐입니다. – Michel

+0

ok, formcollection도 작동하는 것 같습니다. – Michel

+0

위의 편집을 참조하십시오. 마침내 기본 클래스에 속성이 아닌 public 필드가 있다는 것을 알았습니다. 공개 필드를 속성으로 취급하고 의미 론적으로는 그러한 속성을 사용해야하지만 모델 바인딩은 필드를 무시합니다. – codenheim

관련 문제