MVC 3 ModelBinder personalizzato non viene utilizzato
-
12-11-2019 - |
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?
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.