gpt4 book ai didi

asp.net-mvc-2 - "simple forms"的asp.net mvc模型继承

转载 作者:行者123 更新时间:2023-12-02 20:19:49 25 4
gpt4 key购买 nike

你会如何实现这个?

我有以下模型:

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 ) %>

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 ) %>

为了更新,我有以下 Controller 方法:

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 之间,那么这种方法当然行不通。这就是为什么它适用于简单的表单。而且它可以节省大量时间,

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

最佳答案

您会遇到一个问题。

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

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

(我假设所有 Html.EditorFor 语句中缺少的右括号都是拼写错误)

关于asp.net-mvc-2 - "simple forms"的asp.net mvc模型继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3539108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com