你会如何实现这一点?“简单窗体”的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间去,这种做法是行不通的,课程。这就是为什么它是简单的形式。这是一个大的时间节省,
这种方法是否正确,对于简单的情况下,编辑形式是直截了当的?
我只是想知道这样做是否“正确”。如果不是,你将如何实现这一点?
什么你的意思做“正确的吗?” – 2010-08-21 23:24:14
你是对的,没有多大意义。现在在社区wiki – mathieu 2010-08-22 20:51:35