El método no estático requiere un objetivo


238

Tengo una acción de controlador que funciona bien en Firefox tanto localmente como en producción, e IE localmente, pero no IE en producción. Aquí está mi acción de controlador:

public ActionResult MNPurchase()
{
    CalculationViewModel calculationViewModel = (CalculationViewModel)TempData["calculationViewModel"];

    decimal OP = landTitleUnitOfWork.Sales.Find()
        .Where(x => x.Min >= calculationViewModel.SalesPrice)
        .FirstOrDefault()
        .OP;

    decimal MP = landTitleUnitOfWork.Sales.Find()
        .Where(x => x.Min >= calculationViewModel.MortgageAmount)
        .FirstOrDefault()
        .MP;

    calculationViewModel.LoanAmount = (OP + 100) - MP;
    calculationViewModel.LendersTitleInsurance = (calculationViewModel.LoanAmount + 850);

    return View(calculationViewModel);
}

Aquí está el seguimiento de la pila que obtengo en IE:

Error. Se produjo un error al procesar su solicitud. System.Reflection.TargetException: el método no estático requiere un objetivo. en System.Reflection.RuntimeMethodInfo.CheckConsistency (Objetivo del objeto) en System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck (Object obj, BindingFlags invokeAttr, Binder Binder, Object [], parámetros [], CultureInfo culture) en System.Reflection.fountInthod.OptimeMetodo BindingFlags invokeAttr, Binder binder, Object [] parámetros, CultureInfo culture) en System.Reflection.RuntimePropertyInfo.GetValue (Object obj, Object [] index) en System.Data.Objects.ELinq.QueryParameterExpression. CalculateGetFieldOrPropertyValue (instancia, MemberExpression, instancia, ObjectExpression me Object & memberValue) en System.Data.Objects.ELinq.QueryParameterExpression. CalculateEvaluatePath (expresión de expresión,1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Nullable 1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator () en System.Linq.Enumerable.FirstOrDefault [TSource] (IEnumerable 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 fuente) en LandTitle.Controllers.HomeController.MNRefi () en lambda_method (Closure, Controller) , Object []) en System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 parámetros) en Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget () en Castle.DynamicProxy.AbstractInvocation.Proceed () en Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept (II.vocation. Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary``2 parámetros) en System.Web.Mvc.Async.Async.AyncControllerActionInvoker. <> C__DisplayClass37. <> C__Dis..39. .AsyncControllerActionInvoker. <> C__DisplayClass4f.b__49 () en System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37.b__36 (IAsyncResult asyncResult) en System.Web.Mvc.Async. En System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25. <> C__DisplayClass2a.b__20 () en System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25.b__22 (IAsyncResult asyncResult)


Respuestas:


497

Creo que esta excepción confusa ocurre cuando usas una variable en un lambda que es una referencia nula en tiempo de ejecución. En su caso, verificaría si su variable CalculaViewModel es una referencia nula.

Algo como:

public ActionResult MNPurchase()
{
    CalculationViewModel calculationViewModel = (CalculationViewModel)TempData["calculationViewModel"];

    if (calculationViewModel != null)
    {
        decimal OP = landTitleUnitOfWork.Sales.Find()
            .Where(x => x.Min >= calculationViewModel.SalesPrice)
            .FirstOrDefault()
            .OP;

        decimal MP = landTitleUnitOfWork.Sales.Find()
            .Where(x => x.Min >= calculationViewModel.MortgageAmount)
            .FirstOrDefault()
            .MP;

        calculationViewModel.LoanAmount = (OP + 100) - MP;
        calculationViewModel.LendersTitleInsurance = (calculationViewModel.LoanAmount + 850);

        return View(calculationViewModel);
    }
    else
    {
        // Do something else...
    }
}

71
+1 Este es definitivamente el resultado de una NRE en una Where()expresión lambda. Gran respuesta; Me salvó horas hoy.
Yuck

¡Tuve el mismo problema con los valores que no se cargaban y se configuraban desde un constructor de controladores heredado, luego se pasaba a una consulta linq en el constructor de un controlador secundario y arrojaba este misterioso error!
Shawson

3
Creo que la razón por la que obtiene este error es que el Lambda está haciendo una reflexión interna y está tratando de llamar a un método / propiedad en el objeto, pero no se pasa un objeto, por lo que está tratando de llamar al método / propiedad como si fuera estática, pero finalmente se da cuenta de que no es estática. Esta es la razón por la que no obtiene la referencia de objeto antiguo simple no establecida en una instancia de un mensaje de objeto.
Desarrollador de Melbourne

Solo leer la primera oración es suficiente para resolver el problema
Antoine Pelletier

33

Normalmente ocurre cuando el objetivo es nulo. Así que mejor verifique el objetivo de invocación primero y luego haga la consulta linq.


55
en mi caso, fue una excepción de referencia nula en la cláusula
where

12

He descubierto que este problema prevalece en Entity Framework cuando instanciamos una Entidad manualmente en lugar de hacerlo a través de DBContext, que resolverá todas las Propiedades de navegación. Si hay referencias de clave externa (propiedades de navegación) entre las tablas y usa esas referencias en su lambda (por ejemplo, ProductDetail.Products.ID), ese contexto de "Productos" permanece nulo si creó manualmente la entidad.


2

Todas las respuestas apuntan a una expresión Lambda con una NRE (excepción de referencia nula). He descubierto que también ocurre cuando se usa Linq para Entidades. Pensé que sería útil señalar que esta excepción no se limita a solo un NRE dentro de una expresión Lambda.


1

Me enfrento a este error al probar WebAPI en la herramienta Postman.

Después de compilar el código, si eliminamos cualquier línea ( por ejemplo: en mi caso, cuando elimino una línea comentada, se produjo este error ... ) en modo de depuración, se producirá el error "El método no estático requiere un objetivo ".

Nuevamente, intenté enviar la misma solicitud. Este código de tiempo funciona correctamente. Y recibo la respuesta correctamente en Postman.

Espero que le sirva a alguien ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.