2010-02-25 4 views
0

J'ai un classeur de modèle personnalisé qui prend une liste séparée par des virgules et supprime toutes les valeurs vides, puis le transmet au classeur par défaut . Cela a fonctionné dans ASP.NET MVC Preview 2, mais quand j'ai mis à niveau vers RC2, le ci-dessous ne compilera pas parce que l'interface de ValueProvider a seulement une méthode GetValue(), aucun accesseur []. Est ce que je fais ci-dessous possible à travers un autre mécanisme dans le contexte de liaison? Je préfère ne pas avoir à créer un classeur modèle complet pour une situation aussi simple. L'objectif principal est lorsque les valeurs sont liées à une liste <SomeEnum>, toutes les valeurs vides sont ignorées.Comment mettre à jour ModelBinder personnalisé pour travailler avec l'interface ModelBindingContext.ValueProvider modifiée dans ASP.NET MVC RC2

public class EnumListModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var result = bindingContext.ValueProvider[bindingContext.ModelName]; 
     string[] rawValues = (string[])result.RawValue; 
     var newValues = new List<string>(); 
     foreach (string value in rawValues) 
     { 
      if (!String.IsNullOrEmpty(value)) 
      { 
       newValues.Add(value); 
      } 
     } 

     string newValuesAttempted = String.Join(",", newValues.ToArray()); 
     // overwrite the ValueProviderResult with the cleaned up csv list 
     // this is the part I'm not sure how to implement using the interface 
     bindingContext.ValueProvider[bindingContext.ModelName] = 
      new ValueProviderResult(newValues.ToArray(), newValuesAttempted, result.Culture); 

     return System.Web.Mvc.ModelBinders.Binders.DefaultBinder.BindModel(controllerContext, bindingContext); 
    } 
} 

Répondre

1

Qu'est-ce, exactement, est mal à utiliser GetValue() au lieu de [] ici? Il fait la même chose. Mais ValueProvider est maintenant une interface, et les interfaces ne peuvent pas avoir d'indexeurs. Par conséquent, GetValue().

Changer votre code:

var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

Je suis un peu surpris que la distribution sur la ligne suivante jamais travaillé, cependant. Cela semble fortement dépendant de ce que l'utilisateur soumet réellement et du type de propriété particulier. Cela n'a rien à voir avec votre question.

+0

Ce n'est pas la partie que la modification de l'interface ne me permet pas de faire. C'est la 2ème à la dernière ligne où j'écrase le résultat dans la collection ValueProvider – JeremyWeir

+0

En ce qui concerne la distribution, j'utilise uniquement ce modèle de classeur pour les propriétés que je connais les données de formulaire seront conformes – JeremyWeir

+0

Vous devez mettre à jour la * source * spécifique du valeur (par exemple, controllerContext.HttpContext.Request.QueryString [quelque chose] –

Questions connexes