我有一个用产品数据加载的视图。当我按下“添加到购物篮”按钮时,我希望同一页面重新加载,但我收到的错误如下:
Object reference not set to an instance of an object.
查看:
@model List<Ecommerce.Models.HomeModels.Product>
@foreach (Ecommerce.Models.HomeModels.Product product in Model)
{ // above error points here!!!!!!!!!!!
using (Html.BeginForm())
{
<input type="hidden" name="productId" value="@product.ID" />
<input type="submit" value="Add to Basket"/>
}
}
控制器:
public ActionResult BuyProducts()
{
List<Models.HomeModels.Product> products = new List<Models.HomeModels.Product>();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
//Method to load data into products
}
}
TempData["products"] = products;
return View(products);
}
[HttpPost]
[AllowAnonymous]
public ActionResult BuyProducts(string productID)
{
string id = productID;
return View(TempData["products"]);
}
答案 0 :(得分:1)
TempData
仅对一个请求存在,因此当您尝试将其发回时它已经消失(这就是您收到错误的原因 - TempData["products"]
是null
)。无论哪种方式,您都应该使用post redirect get模式,如下所示:
[HttpPost]
[AllowAnonymous]
public ActionResult BuyProducts(string productID)
{
string id = productID;
return RedirectToAction("BuyProducts");
}
主要原因是,如果用户刷新页面并且您从帖子返回了视图,则数据将再次发布,从而导致重复。
答案 1 :(得分:1)
TempData
不会在请求中保留。您可以使用Session
或ViewData
来保存"products"
尝试其中一项并查看是否可以解决您的问题。