为什么我在TempData中收到NullReference异常

时间:2016-04-09 18:32:10

标签: asp.net-mvc

我是Asp Net的新手,我有一些问题。所以我举一个例子来理解,这个例子返回一个带有List中匹配名的tempData。 List在actionResult Index中创建了3个对象。

   [HttpPost]
    public ActionResult Buscar(String NomeP)
    {
        int i;
        List<Models.Produto> Lista = null;

        Lista = Session["SSLista"] != null ? (Session["SSLista"] as List<Models.Produto>) : new List<Models.Produto>();
        for (i = 0; i< Lista.Count; i++) {
            if (Lista[i].Nome.Equals(NomeP)) {
                TempData["Found"] = Lista[i];
            }
        }
      return RedirectToAction("Produto", "Home");

}

当我尝试显示返回时,我收到NUllReference的这个异常,但是tempData有一些数据作为回报。

&lt;%Html.EndForm(); %GT;      &lt;%

if (TempData["Found"] != null)
{ %>
<% 
foreach (var prod in (TempData["Found"] as List<MvcApplication2.Models.Produto>))
{
%>
<br />
<h2>Produtos</h2>
<label>
   Nome: <%=prod.Nome %>
</label>
 <label>
   Descrição <%= prod.Descricao%>
</label>
 <label>
   Preço: <%= prod.Valor_unitario%>
</label>
 <label>
   ID: <%= prod.Id%>
</label><br>
<% }
}

下面的图片显示Tempdata有一些数据,但我可以转换为foreach。

2 个答案:

答案 0 :(得分:2)

通过简单地调试代码,您应该能够找到导致NullReferenceException值的null。你还应该说明你想要访问它的哪个视图。

但是在目前的情况下,您要将Models.Produto的单个实例设置为TempData["Found"],但将其转换为List<MvcApplication2.Models.Produto>,这会导致空引用。

尝试在控制器中设置TempData["Found"] = Lista;

答案 1 :(得分:0)

TempData:通常用于在一个Action方法之间传递数据,如果要将数据从控制器传递到视图,请使用ViewBag或ViewData。

无论如何,问题是你只是将Models.Produto分配给你的TempData

 TempData["Found"] = Lista[i];

在for循环之后,TempData只包含最后一个迭代项目,并且在你的视图中,你试图转换为List<Models.Produto>

foreach (var prod in (TempData["Found"] as List<MvcApplication2.Models.Produto>))

问题是什么。

试试这个

 [HttpPost]
    public ActionResult Buscar(String NomeP)
    {
        int i;
        List<Models.Produto> Lista = null;
        List<Models.Produto> TempList = new  List<Models.Produto>(); //new variable

        Lista = Session["SSLista"] != null ? (Session["SSLista"] as List<Models.Produto>) : new List<Models.Produto>();
        for (i = 0; i< Lista.Count; i++) {
            if (Lista[i].Nome.Equals(NomeP)) {
                TempList.Add(Lista[i]); // add the items to the temp list
            }
        }

      TempData["Found"] = TempList; //assign the final list to temp data
      return RedirectToAction("Produto", "Home");
}

此外,我在 yildizm85 指出后发现了这一点。所以所有信用都归他所有。我更新了我的答案以避免进一步的投票。