TryUpdateModel löst NullReferenceException im ASP.NET MVC 3-Komponententest aus

8

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.List 1..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?

    
Adrian Grigore 12.11.2010, 15:21
quelle

3 Antworten

2

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%     
Adrian Grigore 27.01.2011, 17:18
quelle
15

Sie sollten diesen Code hinzufügen:

%Vor%

Ich habe das gleiche Problem und dieser Code hilft mir.

    
Ivan Korytin 16.12.2010 15:12
quelle
1

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.

%Vor%

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 ...

%Vor%

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

    
bmancini 12.11.2010 15:47
quelle