2011-12-09 30 views
11

Tôi có những điều sau đây, nhưng nó thất bại với một NullReferenceException:Làm cách nào để nhà điều hành Null Coalesce hoạt động trong ASP.NET MVC Razor?

<td>@item.FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault().OneMonth ?? -</td> 

OneMonth được định nghĩa là

public virtual decimal? OneMonth { get; set; } 

và giá trị của nó là null tại thời điểm mà nó không thành công.

Tôi nghĩ toán tử Null Coalesce sẽ kiểm tra nếu giá trị rỗng của nó và nếu có, trả về giá trị ở bên phải toán tử?

Tôi cần thay đổi gì để thực hiện công việc này?

+3

Bạn có chắc chắn nó không phải là đối tượng 'FundPerformance' được chọn bởi' FirstOrDefault() 'có null không? Nếu đó là trường hợp hơn bạn muốn cố gắng để có được một tài liệu tham khảo từ một đối tượng là null, trong đó cung cấp cho một 'NullReferenceException' –

+0

Tôi nghĩ Joakim là đúng. Ngoài ra, bạn thực sự nên thực hiện phép tính này trong ViewModel và chỉ chuyển câu trả lời vào khung nhìn dao cạo của bạn. Và nếu bạn đang thực sự làm một tra cứu cơ sở dữ liệu từ quan điểm của bạn thì đó là rất nghịch ngợm! :-) –

+0

Xin chào các bạn. Nó chỉ ra cả hai của bạn chính xác. Tôi đã làm một câm. Chỉ cần để giảm bớt bất kỳ mối quan tâm, tôi hứa tôi không thực hiện cuộc gọi cơ sở dữ liệu từ Xem! ViewModel được điền trong Controller thông qua một cuộc gọi Service tới Repository. – DaveDev

Trả lời

22

Cú pháp dao cạo, như bạn đã viết, kết thúc tại "OneMonth". Các ?? được hiểu là văn bản. Để có nó được hiểu là dao cạo, bạn phải quấn toàn bộ câu lệnh trong() như sau:

<td>@(item.FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault().OneMonth ?? "-")</td> 

Điều này sẽ vẫn giúp bạn lỗi: toán tử bên trái là số thập phân và toán tử bên phải là một chuỗi. Vì vậy, bạn có thể hiển thị số không thay vì "-" hoặc sử dụng toán tử bậc ba, với OneMonth.Value.ToString() làm giá trị bên trái và "-" làm giá trị đúng.

1

Không liên quan gì đến MVC hoặc Dao cạo.

FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault() 

sẽ trả về null nếu không có phần tử nào khớp, null không có khoảng trống một tháng để bạn sẽ nhận được ngoại lệ lỗi. Bạn không thể sử dụng ?? nhà điều hành vì nó không phải là OneMonth là null, nó là kết quả của FirstOrDefault().

Để kiểm tra thay đổi mã của bạn để

FundPerformance.Where(xx => fund.Id == xx.Id).First().OneMonth ?? -</td> 

Nếu bạn nhận được một "chuỗi không chứa yếu tố" ngoại lệ thay vì sau đó bạn biết đó là vấn đề của bạn.

+0

Đây là vấn đề của tôi, có thể được sửa bằng cách sử dụng toán tử null ('?') Cùng với null -coalescing operator ('??'). 'string emptyIfNull = maybeNullObject? .PossiblyNullProperty ?? ""; ' – Sinjai

Các vấn đề liên quan