2010-08-21 6 views
4

어떻게 구현하나요?asp.net mvc "간단한 양식"모델 상속

나는 다음과 같은 모델이 있습니다

class Something 
{ 
    public string Label { get; set; } 
    public DateTime Date1 { get; set; } 
} 

class SomethingStage2 : Something 
{ 
    public DateTime Date2 { get; set; } 
} 

class SomethingStage3 : SomethingStage2 
{ 
    public DateTime Date3 { get; set; } 
} 

그리고 다음 편집기 템플릿 :

EditorTemplates \ 뭔가를

<%@ Control Language="C#" Inherits="ViewUserControl<Something>" %> 
<%= Html.Hidden("TypeName", Model.GetType()) %> 
<%= Html.EditorFor(x => x.Label) %> 
<%= Html.EditorFor(x => x.Date1) %> 

EditorTemplates \ SomethingStage2

<%@ Control Language="C#" Inherits="ViewUserControl<SomethingStage2>" %> 
<% Html.RenderPartial("EditorTemplates/Something.ascx" %> 
<%= Html.EditorFor(x => x.Date2) %> 

EditorTemplates \ SomethingStage3 업데이트

<%@ Control Language="C#" Inherits="ViewUserControl<SomethingStage3>" %> 
<% Html.RenderPartial("EditorTemplates/SomethingStage2.ascx" %> 
<%= Html.EditorFor(x => x.Date3) %> 

, 나는 다음과 같은 컨트롤러 방법이 있습니다

public ActionResult Update(Something model); 

기술적를, 아주 잘 작동합니다.

업데이트 : http://www.codinginstinct.com/2010/03/aspnet-mvc-and-convention-based-forms.html

public class CustomModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var typeName = bindingContext.ValueProvider.GetValue("TypeName"); 
     var type = Type.GetType(reportFormTypeName.AttemptedValue); 
     var model = bindingContext.ModelMetadata.Model; 
     bindingContext.ModelMetadata = new ModelMetadata(ModelMetadataProviders.Current, 
      bindingContext.ModelMetadata.ContainerType, 
      () => model, type , bindingContext.ModelMetadata.PropertyName); 

     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

이 업데이트 : Date3는 레이블 및 날짜 1 사이를 이동해야하는 경우,이 방법은의, 작동하지 않습니다 모델의 다른 서브 클래스를 처리하기 위해, 나는이 아이디어를 차용 한 코스. 그것이 단순한 형식을위한 것입니다. 그리고 큰 시간을 절약 할 수 있습니다.

이 방법은 정확한지, 편집 양식이 간단한 경우에 맞습니까? 이 방법을 사용하는 것이 "옳은"것인지 궁금합니다. 그렇지 않다면 어떻게 구현할 것입니까?

+0

당신이 무엇을 의미합니까 (난 당신 Html.EditorFor의 모든 조건에 누락 된 닫는 괄호를 믿고있어이 오타입니다) "맞습니까?" –

+0

당신 말이 맞아요,별로 의미하지는 않습니다. 지금 커뮤니티 위키에서 – mathieu

답변

0

실행할 문제가 하나 있습니다.

조치 : public ActionResult Update(Something model);UpdateModel(model)으로 전화하면 기본 클래스의 필드 만 바인딩됩니다.
예를 들어, modelSomethingStage2Label이고 Date1 인 경우 Date2은 바인딩되지 않습니다.

Try/UpdateModel은 런타임 유형이 아닌 컴파일 타임 유형에서 작동하기 때문입니다.
이 문제도 발생했습니다. 내가 여기 솔루션을 게시 :
MVC 2 UpdateModel on Interface, Should ModelBinderAttribute be ignored?

+0

네 말이 맞아. 코드를 추가했습니다. 힘든 내 응용 프로그램에서 그것을 얻었다 :) – mathieu