1

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

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

2 回答 2

1

TempData仅针对一个请求存在,因此在您尝试将其发回时它已经消失(这就是您收到错误的原因 -TempData["products"]null)。无论哪种方式,您都应该使用 post redirect get 模式,如下所示:

[HttpPost]
[AllowAnonymous]
public ActionResult BuyProducts(string productID)
{
    string id = productID;
    return RedirectToAction("BuyProducts");
}

主要原因是如果用户刷新页面并且你从post返回了一个视图,数据将被第二次发布导致重复。

于 2013-01-16T17:35:49.560 回答
1

TempData不会跨请求持久化。您可以使用SessionViewData保存"products"

尝试其中一种,看看是否能解决您的问题。

于 2013-01-16T17:35:56.223 回答