Domanda

Ho una forma che pubblica un mucchio di variabili nascoste, alcune con lo stesso nome. Ecco il corpo post:

OfferId=3802&DeliveryDate=11%2F02%2F2011&DeliveryTime=12%3A00&location=1&location=698

Lo pubblica in un'azione MVC:

[HttpPost]
public ActionResult DeliveryOptions(DeliveryOptions model)
{
    ...
}

Il modello DeliveryOptions sembra questo:

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; }
}

Ora, vorrei analizzare il post location Variabili nell'oggetto Offerlocations, che assomiglia a questo:

[ModelBinder(typeof(OfferLocationsModelBinder))]
public class OfferLocations
{
    [Required]
    public int[] LocationIds { get; set; }
}

Il legante modello è attualmente così:

public class OfferLocationsModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        throw new NotImplementedException();
    }
}

Il problema è che non posso rompere sull'exception notimplement. Il legante del modello non esegue. Probabilmente mi sono perso qualcosa di ovvio; qualche idea?

È stato utile?

Soluzione 3

Non riuscivo a farlo funzionare. Ho dovuto implementare una soluzione alternativa.

Ora sto pubblicando gli ID di posizione come stringa CSV e vengono raccolti dal legante del modello personalizzato, quindi possono essere analizzati nell'array. Peccato che non potessi farlo dall'altra parte.

Altri suggerimenti

Prova a ereditare il legante del modello da System.Web.Mvc.DefaultModelBinder, e sovrascrivere il object BindModel(ControllerContext, ModelBindingContext) metodo. Vedi se funziona. Se lo fa - puoi lavorare da lì :)

Questo è quello che sto facendo in questo momento. Fondamentalmente, ho dovuto assicurarmi che se un tipo specifico è disponibile nella richiesta, un metodo viene eseguito rispetto a questo valore. Il codice di registrazione del legante del modello è esattamente lo stesso: un attributo applicato alla classe della proprietà.

Il legante del modello è il seguente:

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 derivante dal legante del modello di base mi dà il vantaggio aggiuntivo di vincolare tutte le proprietà utilizzando il codice MVC standard e posso quindi estendere l'oggetto deserializzato :)

Spero che sia di aiuto

Quel ModelBinder è registrato con DePedencyResolver? Mi chiedo se MVC abbia problemi a trovare il tuo modello di binder e sta tornando su quello predefinito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top