我目前正在使用C#ASP.NET MVC创建一个电子商务网站,并且遇到了一个问题。在产品页面和搜索结果页面等页面上,我必须将数据列表从我的控制器传递到ViewPage,并且工作正常。但是,如果Viewdata等于null,则会发生空引用异常。当它遍历ViewData并显示产品或评论时,它会发生在视图页面内。
// 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>
当到达以下代码时,会出现Null Reference Exception:
<ul> foreach (E_Store.Models.Product product in ViewData["Products"] as
我想知道的是,如果确实发生这种错误,最好的方法就是捕获这种类型的错误,而不是诉诸if
语句来检查它是否为空。
如果有人知道这样做的好方法,我真的很想知道。
答案 0 :(得分:7)
在你的情况下我会有你的database.GetByCategory(category,page)方法只返回一个空列表而不是null,这样你的foreach语句就没有任何数据可以循环但你不会得到一个null异常。
如果您没有处理列表并且该项为null,我们使用
Html.Encode(ViewData.Eval("Field"))
要获取项目的HTML值,如果项目为空,则返回“”。
答案 1 :(得分:2)
你可以像这样使用内联空值合并运算符:
<%= product.Title ?? "" %>
..但你最终会得到带有空属性的标签。不是你想要的。
你将prb需要在某个地方使用ifs。问题需要它。但问题是“你可以把它们放在哪里而不会让它变得混乱?”
我很好,把整个东西包裹在一个if中。如果你不是,可以为循环的每个项目尝试一个Html扩展方法。传递ViewData模型对象,也许是一个bool条件来测试eval。我将Html.Encode()重载到Html.IfEncode(condition,stringIfTrue,stringIfFalse)你会尝试类似的东西,但对于整个图像和锚组。否则可能会在该视图后面的代码中构建组,并使用
<% =GetImageAndLinkHtml() %>
..例如。
如果您需要更多信息,请告诉我