2013-01-16 4 views
1

제품 데이터가로드 된보기가 있습니다. I 버튼 '바구니에 추가'를 누르면 다시 다시로드 같은 페이지를하고 싶습니다하지만 난 같은 오류를 받고 있어요 :새로 고침 오류시 데이터가있는보기

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

답변

1

TempData은 하나의 요청에 대해서만 존재하므로 다시 보내려고하면 사라집니다 (어떤 이유로 오류 TempData["products"]null). 사용자가 페이지를 새로 고침하고 포스트에서보기를 반환하는 경우 주된 이유는, 데이터를 일으키는 두 번째로 게시됩니다 것을

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

: 어느 쪽이든, 당신은이 같은 포스트 리디렉션 GET 패턴을 사용해야합니다 복사.

+0

고마워요, 이건 내가 찾고 있던 것입니다. – Neeta

+0

사실 그가 진술 한 이유 때문에이 문제를 해결하는 올바른 방법 일 것입니다. 어딘가에 제품 목록을 캐시하여 리디렉션 할 때마다 데이터베이스를 호출하지 않아도되지만 별도의 주제입니다. –

+0

캐싱에 대해 어떻게 생각합니까? 또는 저를 일부 리소스로 리디렉션 할 수 있습니까? – Neeta

1

TempData은 요청간에 지속되지 않습니다. 저장하려면 Session 또는 ViewData을 사용하십시오. "products"

그 중 하나를 시도해보고 문제가 해결되는지 확인하십시오.

+0

그 정보는 매우 유용합니다. 실제로 더 단순한 것을 기대하고있었습니다. – Neeta

관련 문제