Ich habe ein ViewModel, das eine Schnittstelle als Eigenschaft hat. Als ich die Seite einreichte, bekam ich den Fehler "Kann keine Instanz der Schnittstelle erstellen".asp.net MVC-Modell Binding-Fehler "kann keine Instanz der Schnittstelle erstellen"
Das Ansichtsmodell ist wie folgt:
public class PlanoPagamentoViewModel
{
//some properties
public IPlanoPagamentosParcelas PlanoPagamentosParcelas { get; set; }
}
sind es zwei Klassen, die diese Schnittstelle implementieren. Die entsprechenden ViewModels werden dynamisch mit einer PartialView geladen, abhängig von der ausgewählten Option.
public class PlanoPagamentoCartaoViewModel : IPlanoPagamentosParcelas
{
//some properties
}
public class PlanoPagamentoCrediarioViewModel : IPlanoPagamentosParcelas
{
//some properties
}
habe ich eine Forschung, und ich fand, dass die Notwendigkeit eines benutzerdefinierten Modells schaffen Bindung, und ich habe das:
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;
}
}
und fügen Sie diese neue Gewohnheit in Global.asax Bindung, Application_Start Methode:
ModelBinders.Binders.Add(typeof(IPlanoPagamentosParcelas), new PlanoPagamentoParcelasBinder());
Es funktioniert gut für PlanoPagamentoCartaoViewModel
, aber ich würde eine andere kundenspezifische Anbindungen für die PlanoPagamentoCrediarioViewModel
haben müssen, aber ich kann eine neue ModelBinders.Binders.Add nicht nur hinzufügen, mit der gleiche Schlüssel (IPlanoPagamentosParcelas
), weil es bereits einen Schlüssel mit diesem Typ gibt.
Gibt es also einen anderen Ansatz zum Erstellen einer benutzerdefinierten Modellbindung für ViewModels, die die gleiche Schnittstelle implementieren?
ändern typeof (IPlanoPagamentosParcelas) zu typeof (PlanoPagamentoParcelasBinder) oder typeof (DefaultModelBinder) –
@viveknuna Ich habe den gleichen Fehler. Ich müsste die IPlanoPagamentosParcelas für die beiden ViewModels hinzufügen, aber es ist nicht möglich, da es ein Wörterbuch ist – Maturano