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