MVC 3 ModelBinder personnalisé n'est pas utilisé
-
12-11-2019 - |
Question
J'ai une forme qui publie un tas de variables cachées, certaines avec le même nom. Voici le corps du poste:
OfferId=3802&DeliveryDate=11%2F02%2F2011&DeliveryTime=12%3A00&location=1&location=698
Il le publie à une action MVC:
[HttpPost]
public ActionResult DeliveryOptions(DeliveryOptions model)
{
...
}
Le modèle de livraison Options ressemble à ceci:
public class DeliveryOptions
{
public long? OfferId { get; set; }
[CustomValidation(typeof(CustomValidator), "IsDeliveryDateValid")]
public DateTime? DeliveryDate { get; set; }
public DateTime? DeliveryTime { get; set; }
[CustomValidation(typeof(CustomValidator), "IsLocationsValid")]
public OfferLocations Locations { get; set; }
}
Maintenant, je voudrais analyser le Publié location
Variables dans l'objet OffreLocations, qui ressemble à ceci:
[ModelBinder(typeof(OfferLocationsModelBinder))]
public class OfferLocations
{
[Required]
public int[] LocationIds { get; set; }
}
Le classeur du modèle ressemble actuellement à ceci:
public class OfferLocationsModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
throw new NotImplementedException();
}
}
Le problème est que je ne peux pas rompre sur la notation enception. Le liant du modèle ne s'exécute pas. J'ai probablement manqué quelque chose d'évident; des idées?
La solution 3
Je ne pourrais pas faire fonctionner cela. A dû mettre en œuvre une solution de contournement.
Je publie maintenant les ID d'emplacement en tant que chaîne CSV, et ils sont ramassés par le classeur du modèle personnalisé, donc peuvent être analysés dans le tableau. Dommage que je ne puisse le faire dans l'autre sens.
Autres conseils
Essayez de hériter de votre classeur System.Web.Mvc.DefaultModelBinder
, et remplacer le object BindModel(ControllerContext, ModelBindingContext)
méthode. Voyez si cela fonctionne. Si c'est le cas - vous pouvez travailler à partir de là :)
C'est ce que je fais en ce moment. Fondamentalement, je devais m'assurer que si un type spécifique vient dans la demande - une méthode est exécutée par rapport à cette valeur. Le code d'enregistrement du liant du modèle est exactement le même - un attribut appliqué à la classe de la propriété.
Le classeur du modèle est le suivant:
public class TableModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var result = base.BindModel(controllerContext, bindingContext) as ITableModel;
if (result != null)
result.UpdateSorter();
return result;
}
}
PS dérivant du liant du modèle de base me donne l'avantage supplémentaire de la liaison de toutes les propriétés en utilisant le code MVC standard, et je peux ensuite étendre l'objet désérialisé :)
J'espère que cela t'aides
Ce modèle est-il enregistré auprès de la DepedencyResolver? Je me demande si MVC a du mal à trouver votre modèle et se replie sur celui par défaut.