你會如何實現這一點?「簡單窗體」的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