Statik olmayan yöntem bir hedef gerektirir


238

Firefox üzerinde hem yerel hem de üretimde ve IE'de yerel olarak iyi çalışan bir denetleyici eylemim var, ancak üretimde IE değil. İşte benim denetleyici eylem:

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

İşte ben IE almak yığın izleme:

Hata. İşleminiz gerçekleştirilirken bir hata oluştu. System.Reflection.TargetException: Statik olmayan yöntem bir hedef gerektirir. System.Reflection.RuntimeMethodInfo.CheckConsistency'de (Object target) at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck (Object obj, BindingFlags invokeAttr, Binder binder, Object [] parametreleri, CultureInfo kültür) System.Reflection.RuntimeMetho ObjectdInfo nesnesinde, BindingFlags invokeAttr, Binder binder, Object [] parametreleri, CultureInfo kültürü) System.Reflection.RuntimePropertyInfo.GetValue (Object obj, Object [] dizini) System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue (MemberExpress me, Object örneği) Object & memberValue) at System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath (İfade ifadesi,1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Nullable 1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator (), System.Linq.Enumerable.FirstOrDefault [TSource] (IEnumerable 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 kaynak) LandTitle.Controllers.HomeController.MNRefi () 'de lambda_method (Closure Controller, , Object []) at System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionaryCastle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget () 'da Castle.DynamicProxy.AbstractInvocation.Proceed ()' da Castle.DynamicProxy. Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary``2 parametreleri) System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass.As. c__DisplayClass.As. c__DisplayClass37. .AsyncControllerActionInvoker. <> C__DisplayClass4f.b__49 () at System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37.b__36 (IAsyncResult asyncResult) öğesinde System.Web.Mvc.AsyncResult.AsyncControllerActionInvoker. <> C__DisplayClass25. <> C__DisplayClass2a.b__20 () at System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25.b__22 (IAsyncResult asyncResult)


Yanıtlar:


497

Sanırım bu kafa karıştırıcı istisna, çalışma zamanında boş bir başvuru olan lambda'da bir değişken kullandığınızda oluşur. Sizin durumunuzda, değişken calculatorViewModel null başvuru olup olmadığını kontrol ediyorum.

Gibi bir şey:

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 Bu kesinlikle Where()lambda ifadesindeki bir NRE'nin sonucudur . Mükemmel cevap; Bugün beni kurtardı.
Yuck

Değerler yüklenmeyen ve devralınan bir denetleyici yapıcısından ayarlanmayan, daha sonra bir alt denetleyicinin yapıcısında bir linq sorgusuna geçirilen ve bu gizemli hatayı atarak değerlerle aynı sorunu yaşadı!
Shawson

3
Bu hatayı almanızın nedeninin Lambda'nın iç kısımda biraz yansıma yapması ve nesne üzerinde bir yöntem / özellik çağırmaya çalışması, ancak bir nesnenin geçirilmemesi, böylece yöntemi çağırmaya çalıştığını düşünüyorum / özelliği statiktir ancak sonunda statik olmadığının farkına varır. Bu nedenle, düz eski nesne başvurusunu bir nesne iletisinin örneğine ayarlamıyorsunuz.
Melbourne Developer

Sorunu çözmek için sadece ilk cümleyi okumak yeterlidir
Antoine Pelletier

33

Normalde hedef boş olduğunda olur. Bu yüzden önce invoke hedefini kontrol edin, sonra linq sorgusunu yapın.


5
benim durumumda nerede fıkra referans bir istisna oldu
BraveNewMath

12

Bir Varlığı tüm Gezinme Özelliklerini çözecek DBContext yerine el ile başlattığımızda bu sorunu Varlık Çerçevesinde yaygın olarak buldum. Tablolar arasında Yabancı Anahtar referansları (Gezinme Özellikleri) varsa ve lambda'nızda (örn. ProductDetail.Products.ID) bu referansları kullanırsanız, Varlığı el ile oluşturduysanız "Ürünler" bağlamı boş kalır.


2

Tüm cevaplar bir NRE (Boş Referans İstisnası) içeren bir Lambda ifadesine işaret ediyor. Ben de Linq to Entities kullanırken oluşur bulduk. Bu istisnanın sadece Lambda ifadesinin içindeki bir NRE ile sınırlı olmadığını belirtmenin yararlı olacağını düşündüm.


1

Postacı aracında WebAPI testinde bu hatayla karşılaşıyorum.

Kodu oluşturduktan sonra, herhangi bir satırı kaldırırsak ( Örneğin: Benim durumumda bir Yorum satırını kaldırdığımda bu hata oluştu ... ) hata ayıklama modunda " statik olmayan yöntem bir hedef gerektirir " hatası oluşacaktır.

Yine aynı isteği göndermeye çalıştım. Bu zaman kodu düzgün çalışıyor. Ve Postman'da yanıtı düzgün alıyorum.

Umarım birisine kullanır ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.