【问题标题】:Loading View with data upon reload error重新加载错误时使用数据加载视图
【发布时间】:2013-01-16 17:32:43
【问题描述】:

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

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

【问题讨论】:

    标签: razor asp.net-mvc-4


    【解决方案1】:

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

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

    主要原因是如果用户刷新页面,你从post返回了一个view,数据会被第二次post,造成重复。

    【讨论】:

    • 谢谢,这正是我想要的。
    • 由于他所说的原因,这实际上是正确的方法。您可以将产品列表缓存在某处,这样您就不会每次在重定向时都调用数据库,但这是一个单独的主题。
    • 我将如何缓存它?或者您能否将我重定向到一些资源?
    • @Neeta - Darin 是 asp.net mvc 3 的一个很好的资源,你应该浏览他的一些答案,因为他提供了很多很好的内容。这是他对该主题的回答之一:stackoverflow.com/a/8485517/1026459
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您提供的信息,因为它非常有用。不过实际上希望有一些更简单的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多