Razor 重新加载时加载包含数据的视图时出错

Razor 重新加载时加载包含数据的视图时出错,razor,asp.net-mvc-4,Razor,Asp.net Mvc 4,我有一个用产品数据加载的视图。当我按下“添加到购物篮”按钮时,我希望再次重新加载同一页面,但出现以下错误: Object reference not set to an instance of an object. 视图: @型号列表 @foreach(电子商务.模型.家庭模型.模型中的产品) {//以上错误点在这里!!!!!!!!!!! 使用(Html.BeginForm()) { } } 控制器

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

Object reference not set to an instance of an object.
视图:

@型号列表
@foreach(电子商务.模型.家庭模型.模型中的产品)
{//以上错误点在这里!!!!!!!!!!!
使用(Html.BeginForm())
{                                               
}
}
控制器:

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"]);
        }
public ActionResult购买产品()
{
列表产品=新列表();
使用(var reader=command.ExecuteReader())
{
while(reader.Read())
{
//方法将数据加载到产品中
}
}
TempData[“产品”]=产品;
返回视图(产品);
}
[HttpPost]
[异名]
public ActionResult BuyProducts(字符串productID)
{
字符串id=productID;
返回视图(TempData[“产品]);
}

TempData
只存在于一个请求中,因此当您尝试发回它时,它就消失了(这就是为什么会出现错误-
TempData[“产品”]
null
)。无论哪种方式,都应该使用post重定向get模式,如下所示:

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

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

TempData
不会在请求之间持久化。您可以使用
会话
查看数据
保存
“产品”


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

感谢您提供的信息,因为它非常有用。不过我希望能有更简单的事情。谢谢你,这正是我想要的。因为他说的原因,这才是正确的方法。您可以将产品列表缓存在某个位置,这样您就不会每次在重定向时调用数据库,但这是一个单独的主题。我该如何缓存它?或者你能把我引向一些资源吗?@Neeta-Darin是asp.net mvc 3的一个很好的资源,你应该浏览他的一些答案,因为他提供了很多很好的内容。以下是他关于这个话题的一个答案:
[HttpPost]
[AllowAnonymous]
public ActionResult BuyProducts(string productID)
{
    string id = productID;
    return RedirectToAction("BuyProducts");
}