Metode non-statis membutuhkan target

238

Saya memiliki aksi pengontrol yang berfungsi dengan baik di Firefox baik secara lokal maupun dalam produksi, dan IE secara lokal, tetapi tidak dalam produksi. Ini adalah tindakan pengontrol saya:

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);
}

Berikut adalah jejak tumpukan yang saya dapatkan di IE:

Kesalahan. Kesalahan terjadi saat memproses permintaan Anda. System.Reflection.TargetException: Metode non-statis membutuhkan target. di System.Reflection.RuntimeMethodInfo.CheckConsistency (Object target) di System.RefimeMethodInfo.InvokeArgumentsCheck (Object object, BindingFlags invokeAttr, Binder binder, parameter [], Culture [objek], budaya [budayaInfo objek] di Object.Refime. BindingFlags invokeAttr, Binder binder, parameter Object [], CultureInfo culture) di System.Refime.RuntimePropertyInfo.GetValue (Object obj, Object [] index) di System.Data.Objects.ELinq.Quin Object & memberValue) di System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath (Ekspresi ekspresi,1 forMergeOption) at System.Data.Objects.ObjectQuery1.Hasil Hasil (Tidak dapat 1 forMergeOption) at System.Data.Objects.ObjectQuerydihapus 1.Sistem.Koleksi.Kumum.Tak terhitung. DapatkanKumumerator () di System.Linq.Tak dapat dihitung.FirstOrDefault [TSource] ( 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryablesumber IEnumerable 1) di LandTitle.Controllers.HomeController.MHRControler (Cluster di metode) , Objek []) di System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 parameter) di Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget () di Castle.DynamicProxy.AbstractInvocation.Proceed () di Glimpse.Mvc3.Interceptor.InvcAction.InvokeActionMetrationInterproject. Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary``2 parameter) di System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__D33cema. .AsyncControllerActionInvoker. <> C__DisplayClass4f.b__49 () di System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37.b__36 (IAsyncResult asyncResult) di System.Web.AsyncControllerActionInvoker. <> C__DisplayClass25. <> C__DisplayClass2a.b__20 () di System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25.b__22 (IAsyncResultultult)

pengguna547794
sumber

Jawaban:

497

Saya pikir pengecualian membingungkan ini terjadi ketika Anda menggunakan variabel dalam lambda yang merupakan referensi-nol pada saat run-time. Dalam kasus Anda, saya akan memeriksa apakah kalkulasi variabel AndaViewModel adalah referensi-nol.

Sesuatu seperti:

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...
    }
}
Maarten
sumber
71
+1 Ini jelas merupakan hasil dari NRE dalam Where()ekspresi lambda. Jawaban bagus; menyelamatkan saya berjam-jam hari ini.
Yuck
Memiliki masalah yang sama dengan nilai-nilai tidak memuat dan ditetapkan dari konstruktor pengendali yang diwarisi, kemudian diteruskan ke permintaan linq di konstruktor pengendali anak dan melemparkan kesalahan misterius ini!
Shawson
3
Saya berpikir bahwa alasan Anda mendapatkan kesalahan ini adalah bahwa Lambda sedang melakukan beberapa refleksi di internal dan ia mencoba memanggil metode / properti pada objek, tetapi suatu objek tidak diteruskan sehingga ia mencoba memanggil metode / properti seperti itu statis tetapi pada akhirnya menyadari bahwa itu tidak statis. Inilah sebabnya mengapa Anda tidak mendapatkan referensi objek lama polos yang tidak disetel ke instance pesan objek.
Pengembang Melbourne
Hanya membaca kalimat pertama sudah cukup untuk menyelesaikan masalah
Antoine Pelletier
33

Biasanya itu terjadi ketika targetnya nol. Jadi lebih baik periksa target yang dipanggil terlebih dahulu kemudian lakukan permintaan linq.

Jim Yu
sumber
5
dalam kasus saya itu adalah pengecualian referensi nol dalam klausa di mana
BraveNewMath
12

Saya menemukan masalah ini lazim di Entity Framework ketika kami membuat Instansi secara manual daripada melalui DBContext yang akan menyelesaikan semua Properti Navigasi. Jika ada referensi Kunci Asing (Properti Navigasi) antara tabel dan Anda menggunakan referensi itu di lambda Anda (misalnya ProductDetail.Products.ID) maka konteks "Produk" tetap nol jika Anda secara manual membuat Entity.

ccherwin
sumber
2

Semua jawaban menunjuk ke ekspresi Lambda dengan NRE (Null Reference Exception). Saya telah menemukan bahwa itu juga terjadi ketika menggunakan Linq ke Entitas. Saya pikir akan sangat membantu untuk menunjukkan bahwa pengecualian ini tidak terbatas hanya pada NRE di dalam ekspresi Lambda.

Nathan
sumber
1

Saya menghadapi kesalahan ini saat menguji WebAPI di alat tukang pos.

Setelah membuat kode, Jika kita menghapus baris apa pun ( Sebagai contoh: Dalam kasus saya ketika saya menghapus satu baris yang dikomentari, kesalahan ini terjadi ... ) dalam mode debugging maka kesalahan " Metode non-statis memerlukan target " akan terjadi.

Sekali lagi, saya mencoba mengirim permintaan yang sama. Kode waktu ini berfungsi dengan baik. Dan saya mendapatkan respons dengan benar di Postman.

Saya harap ini akan digunakan untuk seseorang ...

Pisau
sumber