Phương pháp không tĩnh yêu cầu một mục tiêu


238

Tôi có một hành động điều khiển hoạt động tốt trên Firefox cả cục bộ lẫn sản xuất và IE cục bộ, nhưng không phải IE trong sản xuất. Đây là hành động điều khiển của tôi:

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

Đây là dấu vết ngăn xếp tôi nhận được trong IE:

Lỗi. Đã xảy ra lỗi trong khi xử lý yêu cầu của bạn. System.Reflection.TargetException: Phương thức không tĩnh yêu cầu một mục tiêu. tại System.Reflection.R.78MethodInfo.CheckConsistency (Object đích) tại System.Reflection.R nbMethodInfo.InvokeArgumentCheck (Object obj, BindingFlags invokeAttr, Binder binder, Object [] BindingFlags invokeAttr, Binder binder, Object [], CultureInfo Culture) tại System.Reflection.R nbPropertyInfo.GetValue (Object obj, Object [] index) tại System.Data.Objects.ELinq.QueryParameterExpression Đối tượng & thành viênValue) tại System.Data.Objects.ELinq.QueryParameterExpression.TryEvaliatedPath (Biểu thức biểu thức,1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Nullable 1.System.Collections.Generic.IEnumerable.GetEnumerator ( 1 forMergeOption) at System.Data.Objects.ObjectQuery) tại System.Linq.Enumerable.FirstOrDefault [TSource] (IEnumerable 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 source) tại LandTitle.Controllers.HomeControll.MN , Object []) tại System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext điều khiểnContext, IDadata2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 tham số) tại Castle.Proxies.Invocations.ControllActionInvoker_InvokeActionMethod.InvokeMethodOnTarget Castle.Proxies.AsyncControllActionInvokerProxy.InvokeActionMethod (ControllerContext điều khiểnContext, các tham số ActionDescriptor, các tham số ActionDescriptor, các tham số ActionDescriptor, các tham số của hành động, các tham số của hành động, các tham số của hành động, các tham số của hành động, các tham số của hành động, các tham số của hành động. .AsyncControllActionInvoker. <> C__DisplayClass4f.b__49 () tại System.Web.Mvc.Async.AsyncControllActionInvoker. <> C__DisplayClass37.b__36 (IAsyncResult asyncResult.AsyncControllActionInvoker. <> C__DisplayClass25. <> C__DisplayClass2a.b__20 () tại System.Web.Mvc.Async.AsyncContoderActionInvoker. <> C__DisplayClass25.b__22 (I)


Câu trả lời:


497

Tôi nghĩ ngoại lệ khó hiểu này xảy ra khi bạn sử dụng một biến trong lambda là tham chiếu null trong thời gian chạy. Trong trường hợp của bạn, tôi sẽ kiểm tra xem biến compViewModel của bạn có phải là tham chiếu null hay không.

Cái gì đó như:

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 Đây chắc chắn là kết quả của một NRE trong Where()biểu thức lambda. Câu trả lời chính xác; tiết kiệm cho tôi giờ hôm nay.
Yuck

Có cùng một vấn đề với các giá trị không được tải và được đặt từ một hàm tạo của bộ điều khiển được kế thừa, sau đó được chuyển vào một truy vấn linq trong hàm tạo của trình điều khiển con và đưa ra lỗi bí ẩn này!
Shawson

3
Tôi nghĩ rằng lý do bạn gặp phải lỗi này là vì Lambda đang thực hiện một số phản ánh trong phần bên trong và nó đang cố gắng gọi một phương thức / thuộc tính trên đối tượng, nhưng một đối tượng không được truyền vào nên nó đang cố gắng gọi phương thức / thuộc tính giống như nó là tĩnh nhưng cuối cùng nó nhận ra rằng nó không tĩnh. Đây là lý do tại sao bạn không nhận được tham chiếu đối tượng cũ đơn giản không được đặt thành phiên bản của thông báo đối tượng.
Nhà phát triển Melbourne

Chỉ cần đọc câu đầu tiên là đủ để giải quyết vấn đề
Antoine Pelletier

33

Thông thường nó xảy ra khi mục tiêu là null. Vì vậy, tốt hơn nên kiểm tra mục tiêu gọi trước sau đó thực hiện truy vấn linq.


5
trong trường hợp của tôi, đó là một ngoại lệ tham chiếu null trong mệnh đề
where

12

Tôi đã thấy vấn đề này phổ biến trong Khung thực thể khi chúng tôi khởi tạo một Thực thể theo cách thủ công thay vì thông qua DBContext sẽ giải quyết tất cả các Thuộc tính Điều hướng. Nếu có các tham chiếu Khóa ngoài (Thuộc tính điều hướng) giữa các bảng và bạn sử dụng các tham chiếu đó trong lambda của mình (ví dụ: ProductDetail. Products.ID) thì ngữ cảnh "Sản phẩm" sẽ không có giá trị nếu bạn tạo Thực thể theo cách thủ công.


2

Tất cả các câu trả lời đều đang trỏ đến một biểu thức Lambda với NRE (Null Reference Exception). Tôi đã thấy rằng nó cũng xảy ra khi sử dụng Linq cho các thực thể. Tôi nghĩ sẽ hữu ích khi chỉ ra rằng ngoại lệ này không giới hạn chỉ là một NRE bên trong biểu thức Lambda.


1

Tôi gặp lỗi này khi kiểm tra WebAPI trong công cụ Postman.

Sau khi xây dựng mã, Nếu chúng tôi xóa bất kỳ dòng nào ( Ví dụ: Trong trường hợp của tôi khi tôi xóa một dòng Nhận xét, lỗi này đã xảy ra ... ) trong chế độ gỡ lỗi thì sẽ xảy ra lỗi " Phương pháp không tĩnh ".

Một lần nữa, tôi đã cố gắng gửi cùng một yêu cầu. Mã thời gian này hoạt động đúng. Và tôi nhận được phản hồi đúng trong Postman.

Tôi hy vọng nó sẽ sử dụng cho ai đó ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.