web-dev-qa-db-ja.com

非静的メッセージはターゲットを必要とします

Firefoxではローカルでもプロダクションでも問題なく動作するコントローラアクションがありますが、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.CheckConsistency(Object target)at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj、BindingFlags invokeAttr、バインダーバインダー、Object []パラメーター、CultureInfo culture)System.Reflection.RuntimeMethodInfo.Invoke(Object target) BindingFlags invokeAttr、バインダーバインダー、System.Reflection.RuntimePropertyInfo.GetValue(Object obj、Object [] index)のSystem.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue(MemberExpression me、Objectインスタンス、Objectインスタンス) System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath(Expression、ConstantExpression&constantExpression)at System.Data.Objects.ELinq.QueryParameterExpression.EvaluateParameter(Object [] arguments)at System.Data.Objects.ELinq.ELinqQueryState System.Linq.Enuの.GetExecutionPlan(Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator())城System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext、IDictionary1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable2パラメータ)でLandTitle.Controllers.HomeController.MNRefi()lambda_methodで(閉鎖、ControllerBase、オブジェクト[])でmerable.FirstOrDefault [TSOURCE(IEnumerable2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary1源) Castle.Proxies.AsyncControllerActionInvokerProxyでCastle.DynamicProxy.AbstractInvocation.ProceedでGlimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept(IInvocation呼び出し)(AT Castle.DynamicProxy.AbstractInvocation.Proceedで.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget()()) System.Web.Mvc.Async.AsyncControllerActionInvokerでの.InvokeActionMethod(ControllerContext controllerContext、ActionDescriptor、actionDescriptor、IDictionary``2のパラメーター)。<> c__DisplayClass37。<> c__DisplayClass39.b__33()でSystem.Web.Mvc.Async.AsyncControllerActionInvokeのc__DisplayClass4f.b__49() System.Web.Mvc.Async.AsyncControllerActionInvokerでのr> <> c__DisplayClass37.b__36(IAsyncResult asyncResult) IAsyncResult asyncResult)

207
user547794

実行時にnull参照であるラムダの中で変数を使用すると、この紛らわしい例外が発生すると思います。あなたのケースでは、私はあなたの変数calculatorViewModelが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...
    }
}
444
Maarten

通常、ターゲットがnullのときに起こります。そのため、最初にinvokeターゲットを確認してから、linqクエリを実行してください。

28
Jim Yu

すべてのナビゲーションプロパティを解決するDBContextを使用するのではなく、手動でエンティティをインスタンス化したときに、この問題がEntity Frameworkで発生していることがわかりました。テーブル間に外部キー参照(ナビゲーションプロパティ)があり、それらの参照をラムダ内で使用する場合(例:ProductDetail.Products.ID)、手動でエンティティを作成した場合、その "Products"コンテキストはnullのままになります。

12
ccherwin

PostmanツールでWebAPIをテストする際にこのエラーに直面します。

コードをビルドした後、任意の行を削除すると(たとえば、コメント行を1つ削除するとこのエラーが発生していました... )、デバッグモードでは "非静的メソッドはターゲットを必要とします "エラーが発生します。

繰り返しますが、私は同じ要求を送信しようとしました。今回のコードは正しく動作しています。そして私はPostmanできちんと応答を得ます。

私はそれが誰かに役立つことを願っています...

2
Shiv

すべての答えは、NRE(Null Reference Exception)を持つLambda式を指しています。 Linq to Entitiesを使用しているときにも発生することがわかりました。この例外は、Lambda式の中のNREだけに限定されないことを指摘すると役立つと思いました。

1
Nathan