O método não estático requer um destino


238

Eu tenho uma ação de controlador que funciona bem no Firefox localmente e na produção e no IE localmente, mas não no IE na produção. Aqui está a minha ação do 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);
}

Aqui está o rastreamento de pilha que recebo no IE:

Erro. Um erro ocorreu durante o processamento do seu pedido. System.Reflection.TargetException: o método não estático requer um destino. em System.Reflection.RuntimeMethodInfo.CheckConsistency (destino do objeto) em System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck (obj de objeto, BindingFlags invokeAttr, fichário de encadernador, parâmetros de Object [], cultura CultureInfo) em System.Reflection.RuntimeMethodInfo.InvokeArguments BindingFlags invokeAttr, fichário do fichário, parâmetros Object [], cultura CultureInfo) em System.Reflection.RuntimePropertyInfo.GetValue (Objeto de objeto, índice Object []) em System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue (MemberExpression me, Instância de objeto, Object & memberValue) em System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath (Expression expression,1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Anulável 1.System.Collections.Generic.IEnumerable.GetEnumerator ( 1 forMergeOption) at System.Data.Objects.ObjectQuery) em System.Linq.Enumerable.FirstOrDefault [TSource] ( 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryablefonte IEnumerable 1) em LandTitle.Controllers.HomeController.MNRefi () em lambda_method (Closure, ControllerBase) , Object []) em System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 parâmetros) em Castle.Proxies.Invocations.ControllerActionInvoke_InvokeActionMethod. Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary``2 parâmetros) em System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37. <> C__DisplayClassc..b33. .AsyncControllerActionInvoker. <> C__DisplayClass4f.b__49 () em System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37.b__36 (IAsyncResult asyncResult) em System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25. <> C__DisplayClass2a.b__20 () em System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25.b__22 (IAsyncResult asyncResult)


Respostas:


497

Eu acho que essa exceção confusa ocorre quando você usa uma variável em um lambda que é uma referência nula em tempo de execução. No seu caso, eu verificaria se a sua variável cálculoViewModel é uma referência 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 Esse é definitivamente o resultado de um NRE em uma Where()expressão lambda. Ótima resposta; me salvou horas hoje.
quer

Teve o mesmo problema com os valores que não foram carregados e configurados a partir de um construtor de controladores herdados, sendo passados ​​para uma consulta linq no construtor de um controlador filho e lançando esse erro misterioso!
Shawson

3
Eu acho que o motivo pelo qual você recebe esse erro é que o Lambda está refletindo internamente e está tentando chamar um método / propriedade no objeto, mas um objeto não está sendo passado, então está tentando chamar o método / propriedade como é estática, mas acaba percebendo que não é estática. É por isso que você não obtém a referência de objeto antigo simples não definida para uma instância de uma mensagem de objeto.
Melbourne Developer

Basta ler a primeira frase é suficiente para resolver o problema
Antoine Pelletier

33

Normalmente isso acontece quando o destino é nulo. Portanto, verifique primeiro o destino da chamada e, em seguida, faça a consulta linq.


5
no meu caso, era uma exceção de referência nula na cláusula
where

12

Descobri que esse problema prevalece no Entity Framework quando instanciamos uma Entidade manualmente, e não através do DBContext, que resolverá todas as Propriedades de navegação. Se houver referências de chave estrangeira (propriedades de navegação) entre tabelas e você as usar no lambda (por exemplo, ProductDetail.Products.ID), o contexto "Produtos" permanecerá nulo se você tiver criado manualmente a entidade.


2

Todas as respostas estão apontando para uma expressão Lambda com um NRE (Exceção de Referência Nula). Eu descobri que isso também ocorre ao usar o Linq to Entities. Eu pensei que seria útil ressaltar que essa exceção não se limita apenas a um NRE dentro de uma expressão Lambda.


1

Eu enfrento esse erro ao testar o WebAPI na ferramenta Postman.

Após criar o código, se removermos qualquer linha ( por exemplo: quando removo uma linha comentada, esse erro ocorreu ... ) no modo de depuração , ocorrerá o erro "O método não estático requer um destino ".

Mais uma vez, tentei enviar o mesmo pedido. Este código de tempo está funcionando corretamente. E eu recebo a resposta corretamente no Postman.

Espero que seja útil para alguém ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.