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


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.