2009-01-21 109 views
5

我目前使用C#ASP.NET MVC创建一个电子商务网站,并刚刚遇到问题。在诸如产品页面和搜索结果页面的页面上,我必须将我的控制器中的数据列表传递给ViewPage,并且工作得很好。但是,如果Viewdata等于null,则会发生空引用异常。它通过ViewData循环并显示产品或评论时发生在视图页面内部。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 - 产物循环

<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>  

达到下面的代码段时,会出现空引用异常:

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

我想知道的是,如果发生这种错误,最好的方法就是捕获这种类型的错误,而不使用if语句来检查它是否为空。

如果有人知道这样做的好方法,我真的很想知道。

回答

7

在你的情况下,我会让你的database.GetByCategory(category,page)方法简单地返回一个空列表而不是null,这样你的foreach语句就不会有任何数据循环但你不会得到一个空例外。

在你没有对付列表,并且该项目是空的情况下,我们使用

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

为了获得该项目的HTML值,它将返回“”如果该项目为空。

+0

哇!非常感谢您的回复,我不敢相信,我从来没有想过的,以前:)再次感谢! – 2009-01-21 21:24:47

2

你可以随时使用空合并运算符的内联这样的:

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

..但你会刚刚结束与空属性标签。几乎不是你想要的。

你会prb需要使用ifs的地方。这个问题需要它。但问题是“你可以把它们放在哪里,而不会让它变得凌乱?”

我很好我把所有东西都包裹在一个if中。如果你不是可能为你的循环的每个项目尝试一个Html扩展方法。传递ViewData模型对象,并可能是一个布尔条件来测试eval。我把Html.Encode()重载到Html.IfEncode(condition,stringIfTrue,stringIfFalse),你会尝试类似的东西,但是对于整个图像和锚组。否则可能在后面的代码中为该视图创建组,然后使用

<% =GetImageAndLinkHtml() %> 

..例如。

让我知道如果你需要更多的信息