비 정적 방법에는 대상이 필요합니다


238

Firefox는 로컬 및 프로덕션 모두에서, IE 로컬에서는 IE에서 작동하지만 프로덕션에서는 IE에서는 잘 작동하는 컨트롤러 작업이 있습니다. 내 컨트롤러 작업은 다음과 같습니다.

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);
}

IE에서 얻는 스택 추적은 다음과 같습니다.

오류. 요청을 처리하는 동안 오류가 발생했습니다. System.Reflection.TargetException : 비 정적 메소드에는 대상이 필요합니다. System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck (Object obj, BindingFlags invokeAttr, Binder binder, Object [] 매개 변수, CultureInfo culture)의 System.Reflection.RuntimeMethodInfo.Invoke (Object obj, System.Reflection.RuntimeMethodInfo.System의 System.Reflection.RuntimeMethodInfo.CheckConsistency (Object target)에서 BindingFlags는 System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue (MemberExpression me, Object instance, System.Reflection.RuntimePropertyInfo.GetValue (Object obj, Object [] index)의 invokeAttr, 바인더 바인더, Object [] 매개 변수, CultureInfo culture)를 호출합니다. System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath (Expression expression,1 forMergeOption) at System.Data.Objects.ObjectQuery1 forMergeOption) at System.Data.Objects.ObjectQuery1. 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryableLandTitle.Controllers.HomeController.MNRefi () lambda_method (Closure, ControllerBase )에서 System.Linq.Enumerable.FirstOrDefault [TSource] (IEnumerable 1 source)의 GetResults (Nullable 1.System.Collections.Generic.IEnumerable.GetEnumerator () System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary의, Object [])2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionaryCastle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget ()에서 2 개의 매개 변수)를 Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept (IInvocationbsA)에서 캐슬 .DynamicProxy.AbstractInvocation.Proceed ()에서 System.Web.Mvc.A의 System.Web.Mvc.Async.AsyncControllerActionInvoker의 Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary``2 parameters). <> c__DisplayClass37. <> c__DisplayClass39.b__33 () System.Web.Avc.Avc.Avc에서. System.Web.Mvc.Async의 System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c__DisplayClass37.b__36 (IAsyncResult asyncResult)의 .AsyncControllerActionInvoker. <> c__DisplayClass4f.b__49 ().AsyncControllerActionInvoker. <> c__DisplayClass25. <> c__DisplayClass2a.b__20 () System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c__DisplayClass25.b__22 (IAsyncResult asyncResult)


답변:


497

런타임에 null 참조 인 람다에서 변수를 사용할 때이 혼란스러운 예외가 발생한다고 생각합니다. 귀하의 경우, 귀하의 변수 calculationViewModel이 null 참조인지 확인합니다.

다음과 같은 것 :

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 이것은 Where()람다 식에서 NRE의 결과입니다 . 큰 답변; 오늘 시간을 절약했습니다.
— Yuck

상속 된 컨트롤러 생성자에서 값이로드되지 않고 설정 된 다음 자식 컨트롤러의 생성자에서 linq 쿼리로 전달 되어이 신비한 오류가 발생하는 것과 동일한 문제가있었습니다!
— Shawson

3
이 오류가 발생하는 이유는 Lambda가 내부에서 약간의 반사를 수행하고 객체에서 메소드 / 속성을 호출하려고하지만 객체가 전달되지 않아 메소드를 호출하려고하기 때문입니다. / property는 정적 인 것처럼 보이지만 결국 정적이지 않다는 것을 깨닫습니다. 그렇기 때문에 평범한 오래된 객체 참조가 객체 메시지의 인스턴스로 설정되지 않은 이유입니다.
— Melbourne 개발자

첫 문장을 읽는 것만으로도 문제를 해결할 수 있습니다
— Antoine Pelletier

33

일반적으로 대상이 null 일 때 발생합니다. 따라서 호출 대상을 먼저 확인한 다음 linq 쿼리를 수행하십시오.


5
내 경우에는 where 절에서 null 참조 예외가 발생했습니다
— BraveNewMath

12

모든 탐색 속성을 해결하는 DBContext 대신 Entity를 수동으로 인스턴스화 할 때 Entity Framework 에서이 문제가 만연한 것으로 나타났습니다. 테이블간에 외래 키 참조 (탐색 속성)가 있고 람다에서 해당 참조를 사용하는 경우 (예 : ProductDetail.Products.ID) Entity를 수동으로 생성 한 경우 "Products"컨텍스트가 null로 유지됩니다.


2

모든 답변은 NRE (Null Reference Exception)가있는 Lambda 식을 가리키고 있습니다. Linq to Entities를 사용할 때도 발생한다는 것을 알았습니다. 이 예외는 Lambda 표현식 내의 NRE에만 국한되지 않는다는 점을 지적하면 도움이 될 것이라고 생각했습니다.


1

Postman 도구에서 WebAPI를 테스트 할 때이 오류가 발생합니다.

코드를 빌드 한 후 디버깅 모드에서 행을 제거하면 ( 예 : 주석 처리 된 행 하나를 제거 할 때이 오류가 발생했습니다 ... ) " 비 정적 방법에는 대상이 필요합니다 "오류가 발생합니다.

다시, 나는 같은 요청을 보내려고 노력했다. 이 타임 코드는 올바르게 작동합니다. 그리고 우편 배달부에서 제대로 응답을 얻습니다.

누군가에게 사용되기를 바랍니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.