asp.net mvc模型继承“简单形式”

时间:2010-08-21 21:40:38

标签: 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
{
     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应该在Label和Date1之间,那么这种方法当然不行。这就是为什么它是简单的形式。而且节省了大量时间,

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

1 个答案:

答案 0 :(得分:0)

您将遇到一个问题。

在您的操作中:public ActionResult Update( Something model );如果您致电UpdateModel(model),则只会绑定基类中的字段。
例如,如果modelSomethingStage2 LabelDate1将被绑定,但Date2则不会。

这是因为Try/UpdateModel对编译时类型而不是运行时类型进行操作 我也遇到过这个问题。我在这里发布了解决方案:
MVC 2 UpdateModel on Interface, Should ModelBinderAttribute be ignored?

(我假设你所有的Html.EditorFor陈述中缺少关闭的parens是错别字)