I Possède un ViewModel possédant une interface en tant que propriété. Lorsque je soumets la page, j'ai l'erreur "Impossible de créer une instance d'interface".asp.net Erreur de liaison au modèle MVC "Impossible de créer une instance d'interface"
Le ViewModel est comme ceci:
public class PlanoPagamentoViewModel
{
//some properties
public IPlanoPagamentosParcelas PlanoPagamentosParcelas { get; set; }
}
Il sont deux classes qui mettent en œuvre cette interface. Les ViewModels correspondants sont dynamiquement chargés avec une vue partielle, en fonction de l'option sélectionnée.
public class PlanoPagamentoCartaoViewModel : IPlanoPagamentosParcelas
{
//some properties
}
public class PlanoPagamentoCrediarioViewModel : IPlanoPagamentosParcelas
{
//some properties
}
J'ai fait une recherche et je trouve que la nécessité de créer un modèle personnalisé contraignant, et je l'ai fait:
public class PlanoPagamentoParcelasBinder : DefaultModelBinder
{
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
var type = typeof(PlanoPagamentoCartaoViewModel);
var model = Activator.CreateInstance(type);
bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type);
return model;
}
}
Et ajouter cette nouvelle coutume liant dans Global.asax, méthode Application_Start:
ModelBinders.Binders.Add(typeof(IPlanoPagamentosParcelas), new PlanoPagamentoParcelasBinder());
Il fonctionne bien pour PlanoPagamentoCartaoViewModel
, mais je besoin d'avoir un autre des liaisons personnalisées pour le PlanoPagamentoCrediarioViewModel
, mais je ne peux pas simplement ajouter une nouvelle ModelBinders.Binders.Add avec la même clé (IPlanoPagamentosParcelas
) car il y a déjà une clé avec ce type.
Alors, existe-t-il une autre approche pour créer une liaison de modèle personnalisé pour ViewModels qui implémente la même interface?
Modifier typeof (IPlanoPagamentosParcelas) à typeof (PlanoPagamentoParcelasBinder) ou typeof (DefaultModelBinder) –
@viveknuna J'ai eu la même erreur. Je devrais ajouter l'IPlanoPagamentosParcelas pour les deux ViewModels, mais ce n'est pas possible car c'est un dictionnaire – Maturano