2010-08-21 55 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

什麼你的意思做「正確的嗎?」 – 2010-08-21 23:24:14

+0

你是對的,沒有多大意義。現在在社區wiki – mathieu 2010-08-22 20:51:35

回答

0

您會遇到一個問題。

在你的行動中:public ActionResult Update(Something model);如果你打電話UpdateModel(model)只有基類中的字段將被綁定。
例如,如果modelSomethingStage2LabelDate1將被綁定,但Date2不會。

這是因爲Try/UpdateModel在編譯時類型而不是運行時類型上運行。
我也遇到了這個問題。我在這裏張貼的解決方案:
MVC 2 UpdateModel on Interface, Should ModelBinderAttribute be ignored?

(我假設在所有Html.EditorFor報表缺少一個右括號有錯別字)

+0

你是對的。我已經添加了代碼。在我的應用程序中得到它堅韌:) – mathieu 2010-08-22 20:56:37