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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top