2010-03-12 6 views
2

Je me rends compte quelque chose comme cela a été demandé, mais cela peut être un peu différentlier une liste appartenant à un autre objet dans un classeur modèle personnalisé dans ASP.NET MVC

Ci-dessous mon objet de l'événement:

Event : IEvent 
    public int Id 
    public string Title 
    public List<EventContact> Contacts 

Et événementNous:

EventContact 
    public int Id 
    public string Name 
    public string Email 

Ainsi, un Event a une liste de EventContact objets. Maintenant, Event implémente également IEvent - d'où le classeur de modèle personnalisé. J'utilise IEvent au lieu de Event, donc quand le classeur par défaut essaie de faire son truc, ça me permet de savoir qu'il ne peut pas créer un `IEvent '.

J'ai moi avec peuplé avec les informations de contact:

<input type="text" name="contact[0].Name" value="DB Value"/> 
<input type="text" name="contact[1].Name" value="DB Value"/> 
<input type="text" name="contact[2].Name" value="DB Value"/> 

<input type="text" name="contact[0].Email" value="DB Value"/> 
<input type="text" name="contact[1].Email" value="DB Value"/> 
<input type="text" name="contact[2].Email" value="DB Value"/> 

<!-- Event fields, etc --> 

Ainsi, dans mon classeur de modèle personnalisé Je suis en mesure de voir toutes les valeurs - doux! La seule chose est, je ne sais pas vraiment comment obtenir tous les champs de contact et créer une liste de contacts de leur part, ainsi que la liaison de tous les champs de l'événement.

Toute aide est appréciée!

Répondre

1

Pour accomplir ce qui précède, je simplement interrogé ValueProvider de contexte de liaison existant pour tous les champs de événementNous et envoyé que le long du liant modèle par défaut avec un nouveau contexte de liaison:

IDictionary<string, ValueProviderResult> contactValueProvider = bindingContext.ValueProvider 
      .Select(t => new { t.Key, t.Value }) 
      .Where(t => t.Key.Contains("EventContact")) 
      .ToDictionary(t => t.Key, t => t.Value); 

ModelBindingContext contactBindingContext = new ModelBindingContext() 
     { 
      ModelName = "EventContact", 
      ModelState = bindingContext.ModelState, 
      ModelType = typeof(List<EventContact>), 
      PropertyFilter = bindingContext.PropertyFilter, 
      ValueProvider = contactValueProvider 
     }; 

_event.Contacts = ModelBinders.Binders.DefaultBinder.BindModel(controllerContext, contactBindingContext) as IQueryable<EventContact>; 

Il fonctionne, donc je suis content: P

+1

Aussi, j'ai téléchargé la source MVC et débogué avec cela - recommande fortement de le faire si vous êtes dans une impasse. Ce qui est intéressant :) – Dan

+0

Est-ce que cela fonctionne pour MVC 2.0 comme je n'ai pas pu compiler l'exemple de code source. Ce code est-il dans la méthode BindModel de votre Event ModelBinder? – David

Questions connexes