[C#] 비 정적 방법에는 대상이 필요합니다

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.ObjectQuery
1 forMergeOption) at
System.Data.Objects.ObjectQuery
1. 1 source) at
System.Linq.Queryable.FirstOrDefault[TSource](IQueryable
LandTitle.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, IDictionary
Castle.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)



답변

런타임에 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) Entity를 수동으로 생성 한 경우 “Products”컨텍스트가 null로 유지됩니다.


답변

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


답변

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

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

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

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


답변