2009-01-21 71 views
5

Tôi hiện đang tạo một trang thương mại điện tử bằng cách sử dụng C# ASP.NET MVC và vừa gặp một vấn đề. Trên các trang như trang sản phẩm và trang kết quả tìm kiếm, tôi phải chuyển Danh sách dữ liệu từ bộ điều khiển của tôi sang ViewPage và hoạt động tốt. Tuy nhiên, một ngoại lệ tham chiếu null xảy ra nếu Viewdata bằng null. Nó xảy ra bên trong viewpage khi nó lặp qua ViewData và hiển thị các sản phẩm hoặc đánh giá.ASP.NET MVC ViewData Null

//ProductController.cs

public ActionResult Products_Sub(string category, int page) 
{ 
ViewData["Products"] = database.GetByCategory(category, page); 
return View(); 
} 

//ViewPage.cs - vòng lặp sản phẩm

<ul> foreach (E_Store.Models.Product product in ViewData["Products"] as 
List<e_store.models.product>) 
{%> 
<li> 
<img alt="<%= product.Title%>" src="<%= product.Thumbnail %>" /> 
<a href="/<%=product.Category %>/<%= product.SubCategory %>/<%= product.ASIN %>/1"> 
<%=product.Title%></a> 
</li> 
}%> 
</ul>  

Các ngoại lệ Null Reference xảy ra khi đoạn mã sau đây đã đạt được:

<ul> foreach (E_Store.Models.Product product in ViewData["Products"] as 

Những gì tôi muốn biết là cách tốt nhất để nắm bắt loại lỗi này nếu nó xảy ra, mà không cần phải báo cáo if kiểm tra xem nó có phải là không.

Nếu có ai biết cách tốt để làm điều này, tôi thực sự rất muốn biết.

Trả lời

7

Trong trường hợp của bạn, tôi sẽ có cơ sở dữ liệu của bạn.GetByCategory (thể loại, trang) phương pháp chỉ cần trả về một danh sách trống thay vì null, cách này tuyên bố foreach của bạn sẽ không có bất kỳ dữ liệu để lặp qua nhưng bạn sẽ không nhận được một ngoại lệ null.

Trong trường hợp mà bạn đang phải đối phó với một danh sách và mục là null, chúng tôi sử dụng

Html.Encode(ViewData.Eval("Field")) 

Để có được giá trị HTML của mục, nó sẽ trở lại "" nếu mục là null.

+0

Wow !, cảm ơn bạn rất nhiều vì đã trả lời, tôi không thể tin rằng tôi chưa bao giờ nghĩ về điều đó trước :) Cảm ơn một lần nữa! –

2

bạn luôn có thể sử dụng vô điều hành coalescing inline như thế này:

<%= product.Title ?? "" %> 

..nhưng bạn sẽ chỉ kết thúc với thẻ với các thuộc tính sản phẩm nào. không phải những gì bạn muốn.

bạn sẽ cần sử dụng ifs ở đâu đó. vấn đề kêu gọi nó. nhưng câu hỏi đặt ra là "nơi bạn có thể đặt chúng mà không làm cho nó lộn xộn?"

Tôi ổn cả những điều trong một trường hợp. nếu bạn không có thể thử một phương pháp mở rộng Html cho mỗi mục trong vòng lặp của bạn. vượt qua trong đối tượng mô hình ViewData và có thể là một điều kiện bool để kiểm tra eval. tôi quá tải Html.Encode() để Html.IfEncode (điều kiện, stringIfTrue, stringIfFalse) bạn sẽ thử một cái gì đó tương tự, nhưng đối với toàn bộ hình ảnh và nhóm neo. nếu không, có thể xây dựng nhóm trong mã phía sau cho chế độ xem đó và chỉ sử dụng

<% =GetImageAndLinkHtml() %> 

.. ví dụ.

cho tôi biết nếu bạn cần thêm thông tin