Asp.net mvc 2 “的asp.net mvc模型继承”;简单表格“;

Asp.net mvc 2 “的asp.net mvc模型继承”;简单表格“;,asp.net-mvc-2,architecture,Asp.net Mvc 2,Architecture,您将如何实现这一点 我有以下型号: class Something { public string Label { get; set; } public DateTime Date1 { get; set; } } class SomethingStage2 : Something { public DateTime Date2 { get; set; } } class SomethingStage3 : SomethingStage2 { publ

您将如何实现这一点

我有以下型号:

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\Something

<%@ Control Language="C#" Inherits="ViewUserControl<Something>" %>
<%= Html.Hidden( "TypeName", Model.GetType() ) %>
<%= Html.EditorFor( x => x.Label ) %>
<%= Html.EditorFor( x => x.Date1 ) %>
从技术上讲,它工作得很好

更新:为了处理模型的不同子类,我借用了以下想法:

更新:如果Date3应该介于标签和Date1之间,那么这种方法当然行不通。这就是为什么它适用于简单形式。这是一个巨大的时间节省


对于编辑表单很简单的简单情况,这种方法正确吗?我只是想知道这样做是否“正确”。如果没有,您将如何实现这一点?

您将遇到一个问题

在您的操作中:
公共操作结果更新(某物模型)
如果调用
UpdateModel(model)
则仅绑定基类中的字段。
例如,如果
model
SomethingStage2
标签
Date1
将被绑定,但
Date2
将不被绑定

这是因为
Try/UpdateModel
对编译时类型而不是运行时类型进行操作。
我也遇到了这个问题。我在这里发布了解决方案:


(我假设你所有的
Html.EditorFor
语句中缺少的结尾部分都是打字错误)

你说的“正确”是什么意思?你说的对,没有多大意义。现在在维基社区,你是对的。我已经添加了代码。在我的申请表中找到了:)
<%@ Control Language="C#" Inherits="ViewUserControl<SomethingStage2>" %>
<% Html.RenderPartial("EditorTemplates/Something.ascx" %>
<%= Html.EditorFor( x => x.Date2 ) %>
<%@ Control Language="C#" Inherits="ViewUserControl<SomethingStage3>" %>
<% Html.RenderPartial("EditorTemplates/SomethingStage2.ascx" %>
<%= Html.EditorFor( x => x.Date3 ) %>
public ActionResult Update( Something model );
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);
    }
}