2010-08-21 6 views
4

Comment implémenteriez-vous cela?asp.net héritage du modèle mvc pour "formes simples"

je le modèle suivant:

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; } 
} 

Et les modèles de l'éditeur suivants:

EditorTemplates \ Quelque chose

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

Pour la mise à jour, je la méthode de commande suivante:

public ActionResult Update(Something model); 

Techniquement, il fonctionne très bien.

Mise à jour: pour traiter les différentes sous-classes du modèle, je l'ai emprunté cette idée: 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); 
    } 
} 

Mise à jour: Si DATE3 doit aller entre l'étiquette et Date1, cette approche ne fonctionnera pas, cours. C'est pourquoi c'est pour des formes simples. Et c'est un grand gain de temps,

Cette approche est-elle correcte, pour les cas simples, où les formulaires d'édition sont simples? Je me demande simplement si c'est "juste" de le faire de cette façon. Si non, comment le mettriez-vous en œuvre?

+0

Que voulez-vous dire par « correct? » –

+0

Vous avez raison, ne veut pas dire grand-chose. maintenant dans la communauté wiki – mathieu

Répondre

0

Vous rencontrerez un problème.

Dans votre action: public ActionResult Update(Something model); si vous appelez UpdateModel(model), seuls les champs de la classe de base seront liés.
Par exemple, si model est un SomethingStage2Label et Date1 sera lié, mais pas Date2. Ceci est dû au fait que Try/UpdateModel fonctionne sur le type de temps de compilation et non sur le type d'exécution.
J'ai également rencontré ce problème. J'ai posté la solution ici:
MVC 2 UpdateModel on Interface, Should ModelBinderAttribute be ignored?

(je suppose que les parens de fermeture manquants dans toutes vos déclarations sont Html.EditorFor fautes de frappe)

+0

vous avez raison. J'ai ajouté le code. Je l'ai dans mon application difficile :) – mathieu