2010-08-25 8 views
0

J'ai un objet assez complexe avec de nombreux types de données. Quelques types de données sont des listes (LazyLists pour être exact).Empêcher un classeur modèle de retourner une liste d'objets NULL dans ASP.NET MVC

Dans ma forme, je laisse l'utilisateur d'entrer jusqu'à, disons 3 articles pour cette liste et mes noms d'entrée de formulaire correspondent de façon appropriée:

myObj[0].Name 
myObj[0].Email 
...consectuviely... 
myObj[2].Name 
myObj[2].Email 

Si l'utilisateur décide d'entrer une seule valeur de l'objet, c'est très bien avec moi, mais je ne veux pas une liste comme ceci:

myObjList[0] = {Name = "joe", Email = "[email protected]"} 
myObjList[1] = {Name = null, Email = null} 
myObjList[2] = {Name = null, Email = null} 

le problème que j'ai trouvé est que le DefaultModelBinder va créer d'abord l'objet puis lier tout simplement pas les propriétés - en laissant l'objet avec des propriétés null. Dans le cas d'une liste, la méthode UpdateCollection ne semble pas s'en soucier et ajoute simplement les objets lorsqu'il y a des objets à ajouter.

Des idées? Y a-t-il quelque chose de simple qui me manque?

Répondre

0

Cela semble bien fonctionner. Je lie la liste normalement, puis je retourne seulement les éléments qui ne sont pas égaux à un nouveau EventContact (où tous les champs sont null).

public class EventContactListModelBinder : IModelBinder 
{ 
    #region IModelBinder Members 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     LazyList<EventContact> contacts = (LazyList<EventContact>)ModelBinders.Binders.DefaultBinder.BindModel(controllerContext, bindingContext); 
     var p = (from e in contacts 
       where !e.Equals(new EventContact()) 
       select e).AsQueryable(); 
     return new LazyList<EventContact>(p); 
    } 

    #endregion 
} 

Je suis toujours ouvert à une solution plus élégante si l'on existe :)