วิธีการไม่คงที่ต้องมีเป้าหมาย


238

ฉันมีตัวควบคุมที่ทำงานได้ดีบน Firefox ทั้งในระดับท้องถิ่นและในการผลิตและ 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);
}

นี่คือ stack trace ที่ฉันได้รับใน IE:

ความผิดพลาด เกิดข้อผิดพลาดขณะประมวลผลคำขอของคุณ System.Reflection.TargetException: วิธีการไม่คงที่ต้องการเป้าหมาย ที่ System.Reflection.RuntimeMethodInfo.CheckConsistency (เป้าหมายวัตถุ) ที่ System.Reflection.RuntimeMethodIn เจ็ท ObjectDataRuntimeMethodIntoke (วัตถุ obj, BindingFlags invokeAttr, Binder Binder, วัตถุ [] พารามิเตอร์ BindingFlags invokeAttr, Binder Binder, พารามิเตอร์ Object [], วัฒนธรรม CultureInfo) ที่ System.Reflection.RuntimePropertyInfo.GetValue (Object obj, Object [] ดัชนี) ที่ System.Data.Objects.ELinq.QueryParameterExpression Object & memberValue) ที่ System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath (นิพจน์นิพจน์,1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Nullable 1.System.Collections.Generic.IEnumerable.GetEnumerator ( 1 forMergeOption) at System.Data.Objects.ObjectQuery) ที่ System.Linq.Enumerable.FirstOrDefault [TSource] (IEnumerable 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 แหล่งที่มา) ที่ LandTitle.Controllers.HomeController.MNRefi , Object []) ที่ System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 พารามิเตอร์) ที่ Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnvatetonAtteret () ที่ CastleAdminAction (ProgressInProcess () ที่ Glimpse.Mvc3.Interceptor. Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor actionDescriptor, IDictionary``2 พารามิเตอร์) ที่ System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c__DisplayClass37. .AsyncControllerActionInvoker. <> c__DisplayClass4f.b__49 () ที่ System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c__DisplayClass37.b__36 (IAsyncResult asyncResult) ที่ System.Web.Mvc.AsyncAsyncControllerActionInvoker. <> c__DisplayClass25. <> c__DisplayClass2a.b__20 () ที่ System.Web.Mvc.Async.Async.Async.AsyncControllerActionInvoker. <> c__DisplayClass25.b__22 (IAsyncResult asyncResult)


คำตอบ:


497

ฉันคิดว่านี่เป็นข้อยกเว้นที่สับสนเกิดขึ้นเมื่อคุณใช้ตัวแปรในแลมบ์ดาซึ่งเป็นการอ้างอิงแบบ null ในเวลาทำงาน ในกรณีของคุณฉันจะตรวจสอบว่าการคำนวณตัวแปรของคุณ ViewModel เป็นข้อมูลอ้างอิงแบบ 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 นี่คือผลลัพธ์ที่แน่นอนของ NRE ในรูปแบบWhere()แลมบ์ดา คำตอบที่ดี; ช่วยฉันชั่วโมงชั่วโมงวันนี้
Yuck

มีปัญหาเดียวกันกับค่าที่ไม่โหลดและถูกตั้งค่าจากคอนสตรัคเตอร์คอนโทรลเลอร์ที่สืบทอดมาจากนั้นจะถูกส่งผ่านไปยังเคียวรี linq ในตัวสร้างของตัวควบคุมเด็กและโยนข้อผิดพลาดลึกลับนี้!
Shawson

3
ฉันคิดว่าเหตุผลที่คุณได้รับข้อผิดพลาดนี้คือแลมบ์ดากำลังทำการไตร่ตรองภายใน internals และกำลังพยายามเรียกใช้เมธอด / คุณสมบัติบนวัตถุ แต่วัตถุไม่ได้ถูกส่งผ่านดังนั้นจึงพยายามเรียกใช้เมธอด / property เหมือนเป็น static แต่ในที่สุดมันก็รู้ตัวว่ามันไม่ใช่ static นี่คือเหตุผลที่คุณไม่ได้รับการอ้างอิงวัตถุเก่าแบบธรรมดาที่ไม่ได้ตั้งค่าเป็นอินสแตนซ์ของข้อความวัตถุ
นักพัฒนาเมลเบิร์น

แค่อ่านประโยคแรกก็เพียงพอที่จะแก้ปัญหาได้
Antoine Pelletier

33

โดยปกติจะเกิดขึ้นเมื่อเป้าหมายเป็นโมฆะ ดังนั้นให้ตรวจสอบเป้าหมายการเรียกใช้ก่อนจากนั้นจึงทำการสืบค้น linq


5
ในกรณีของฉันมันเป็นข้อยกเว้นอ้างอิงเป็นโมฆะในส่วนคำสั่ง
BraveNewMath

12

ฉันพบว่าปัญหานี้แพร่หลายใน Entity Framework เมื่อเราสร้างอินสแตนซ์ Entity ด้วยตนเองมากกว่าผ่าน DBContext ซึ่งจะแก้ไขคุณสมบัติการนำทางทั้งหมด หากมีการอ้างอิงคีย์ต่างประเทศ (คุณสมบัติการนำทาง) ระหว่างตารางและคุณใช้การอ้างอิงเหล่านั้นในแลมบ์ดาของคุณ (เช่น ProductDetail.Products.ID) ดังนั้นบริบท "ผลิตภัณฑ์" จะยังคงว่างถ้าคุณสร้างเอนทิตีด้วยตนเอง


2

คำตอบทั้งหมดชี้ไปที่นิพจน์แลมบ์ดาด้วย NRE (ข้อยกเว้นอ้างอิง Null) ฉันพบว่ามันเกิดขึ้นเมื่อใช้ Linq กับ Entities ฉันคิดว่ามันจะมีประโยชน์ที่จะชี้ให้เห็นว่าข้อยกเว้นนี้ไม่ จำกัด เพียงแค่ NRE ภายในนิพจน์แลมบ์ดา


1

ฉันประสบข้อผิดพลาดนี้ในการทดสอบ WebAPI ในเครื่องมือบุรุษไปรษณีย์

หลังจากสร้างรหัสแล้วหากเราลบบรรทัดใด ๆ ( ตัวอย่าง: ในกรณีของฉันเมื่อฉันลบหนึ่งบรรทัดที่มีความคิดเห็นข้อผิดพลาดนี้เกิดขึ้น ... ) ในโหมดการแก้ไขข้อผิดพลาดแล้วข้อผิดพลาด " วิธีไม่คงที่ต้องใช้เป้าหมาย " จะเกิดขึ้น

อีกครั้งฉันพยายามส่งคำขอเดียวกัน รหัสเวลานี้ทำงานอย่างถูกต้อง และฉันก็ได้รับคำตอบอย่างถูกต้องในบุรุษไปรษณีย์

ฉันหวังว่ามันจะใช้กับใครบางคน ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.