Da ich von MVC 2 auf MVC 3 RC aktualisiert habe, verursacht die Verwendung von TryUpdateModel eine NullReferenceException. Dieses Problem tritt nur auf, wenn meine Aktionsmethode als Teil eines Komponententests ausgeführt wird. Das Ausführen auf dem tatsächlichen Server funktioniert wie erwartet.
Hier ist ein Stack-Trace der Ausnahme:
System.NullReferenceException: Objekt Referenz nicht auf eine Instanz von einem festgelegt Objekt. beim System.Web.Mvc.JsonValueProviderFactory.GetValueProvider (ControllerContext controllerContext) um System.Web.Mvc.ValueProviderFactoryCollection. & Lt; & gt; c_ DisplayClassc.b _7 (ValueProviderFactory Fabrik) bei System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext () beim System.Collections.Generic.List1..ctor(IEnumerable
1 Sammlung) bei System.Linq.Enumerable.ToList [TSource] (IEnumerable'1 Quelle) um System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider (ControllerContext controllerContext) um System.Web.Mvc.Controller.TryUpdateModel [TModel] (TModel Modell, String-Präfix)
... mein eigener Code von hier an ....
Falls es darauf ankommt, hat mein Controller die folgende Unterschrift:
%Vor%Meine Vermutung ist, dass dies mit der neuen Arbeitsweise von DI in MVC3 zu tun hat, aber ich kann nicht herausfinden, was ich falsch mache. Vielleicht gibt es etwas in Bezug auf DI-Setup, das in MVC 3 erforderlich ist, aber in MVC 2 nicht erforderlich war?
Falls jemand anders das gleiche Problem hat und diesen Beitrag findet:
Ich löste das Problem generisch auf der Basis von Ivan Kortyms Antwort (danke!), mit dem folgenden Stück Code in meinem Controller-Basisklassenkonstruktor:
%Vor%Sie sollten diesen Code hinzufügen:
%Vor%Ich habe das gleiche Problem und dieser Code hilft mir.
Es ist wahrscheinlich eine Änderung in der Implementierung von System.Web.Mvc.JsonValueProviderFactory.GetValueProvider
, die einen Wert in ControllerContext
erreicht, der null ist.
Sie müssen möglicherweise einen zusätzlichen Wert in ControllerContext
vortäuschen.
Zumindest würde ich dort zuerst nachsehen.
BEARBEITEN
Ja, es sieht so aus, als ob es eine Überprüfung auf controllerContext
durchführt.
Vom Stacktrace können wir TryUpdateModel[TModel](TModel model, String prefix)
sehen. Mit reflector greift es auf die Eigenschaft ControllerBase
ValueProvider
zu. Dies wiederum ruft ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext)
mit der aktuellen Eigenschaft Controllers ControllerContext
auf.
Sie sollten nur in der Lage sein, eine neue ControllerContext
Instanz zu erstellen und die Eigenschaft des Controllers entsprechend einzustellen ...
Einige zusätzliche Spottmaßnahmen sind möglicherweise erforderlich, damit sie vollständig funktionieren. Einige Informationen darüber, wie ControllerContext vollständig simuliert werden kann: Asp.net-mvc Controller Context verspotten
Tags und Links asp.net-mvc asp.net-mvc-3 dependency-injection model-binding