【问题标题】:ASP.NET MVC ViewData NullASP.NET MVC ViewData 空
【发布时间】:2010-10-02 15:05:30
【问题描述】:

我目前正在使用 C# ASP.NET MVC 创建一个电子商务网站,但遇到了一个问题。在产品页面和搜索结果页面等页面上,我必须将数据列表从我的控制器传递到 ViewPage 并且效果很好。但是,如果 Viewdata 等于 null,则会发生 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>    

当到达以下代码段时会发生空引用异常:

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

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

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

【问题讨论】:

    标签: c# asp.net-mvc .net-3.5


    【解决方案1】:

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

    如果您不处理列表并且项目为空,我们使用

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

    要获取项目的 HTML 值,如果项目为空,它将返回 ""。

    【讨论】:

    • 哇!,非常感谢您的回复,我不敢相信我以前从未想过:)再次感谢!
    【解决方案2】:

    你总是可以像这样内联使用空合并运算符:

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

    ..但是你最终会得到带有空属性的标签。可能不是你想要的。

    您将需要在某处使用 ifs。问题需要它。但问题是“你可以把它们放在哪里而不弄乱?”

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

    <% =GetImageAndLinkHtml() %>
    

    ..例如。

    如果您需要更多信息,请告诉我

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 2010-09-06
      • 2010-09-08
      相关资源
      最近更新 更多