asp.net наследование модели mvc для "простых форм" - PullRequest
4 голосов
/ 22 августа 2010

Как бы вы это реализовали?

У меня есть следующая модель:

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

Для обновления у меня есть следующий метод контроллера:

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 голосов
/ 22 августа 2010

Есть одна проблема, с которой вы столкнетесь.

В вашем действии: public ActionResult Update( Something model );, если вы позвоните UpdateModel(model), будут связаны только поля в базовом классе.
Например, если model является SomethingStage2 Label и Date1 будет связано, но Date2 не будет.

Это потому, что Try/UpdateModel работает с типом времени компиляции, а не с типом времени выполнения.
Я столкнулся с этой проблемой также. Я разместил решение здесь:
MVC 2 UpdateModel в интерфейсе, должен ли игнорироваться ModelBinderAttribute?

(я предполагаю, что пропущенные закрывающие скобки во всех ваших Html.EditorFor утверждениях являются опечатками)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...