在重载错误时加载包含数据的视图

时间:2013-01-16 17:32:44

标签: razor asp.net-mvc-4

我有一个用产品数据加载的视图。当我按下“添加到购物篮”按钮时,我希望同一页面重新加载,但我收到的错误如下:

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"]);
        }

2 个答案:

答案 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不会在请求中保留。您可以使用SessionViewData来保存"products"

尝试其中一项并查看是否可以解决您的问题。