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

TempData1つのリクエストに対してのみ存在するため、それを返送しようとするまでになくなります(これが、エラーが発生する理由です-is TempData["products"]null。いずれの場合も、次のように、リダイレクト後の取得パターンを使用する必要があります。

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

主な理由は、ユーザーがページを更新し、投稿からビューを返した場合、データが2回投稿され、重複が発生するためです。

于 2013-01-16T17:35:49.560 に答える
1

TempDataリクエスト間で永続化されません。Sessionまたはを使用ViewDataして保存できます"products"

それらの1つを試して、問題が解決するかどうかを確認してください。

于 2013-01-16T17:35:56.223 に答える