IT story

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

hot-time 2020. 4. 25. 09:55
반응형

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


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.Reflection.RuntimeMethodInfo. 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, ConstantExpression &)의 Object & memberValue)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 ()의 Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept (IInvocationbsProc.Inc.에서 캐슬 .DynamicProxy.AbstractInvocation.Proceed ()의 2 매개 변수) 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.Mvc.Async.AsyncControllerActionInvoker. <> c__DisplayClass37.b__36 (IAsyncResult asyncResult)의 System.Web.Mvc.Async.AsyncControllerActionInvoker. <>에서 .AsyncControllerActionInvoker. <> c__DisplayClass4f.b__49 ()System.Web.Mvc.Async.AsyncControllerActionInvoker의 c__DisplayClass25. <> c__DisplayClass2a.b__20 () <> c__DisplayClass25.b__22 (IAsyncResult asyncResult)


런타임에 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...
    }
}

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


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


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


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

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

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

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

참고 URL : https://stackoverflow.com/questions/13717355/non-static-method-requires-a-target

반응형