2012-09-18 102 views
0

我將List<Listing>對象傳遞給另一個操作方法,並使該方法使用該參數調用View。ASP.NET MVC null參數

出於某種原因,我傳遞的參數爲null。

下正常工作:

 public ActionResult SortListing(string categoryGuid) 
    { 
     var listingCategory = new ListingCategory(); 
     listingCategory = _tourismAdminService.GetByGuid<ListingCategory>(Guid.Parse(categoryGuid)); 
     var listings = new List<Listing>(); 

     foreach (var listing in _tourismAdminService.ListAllEntities<Listing>()) 
     { 
      if (listing.CategoryId == listingCategory.Id) 
      { 
       listings.Add(listing); 
      } 
     } 

     return RedirectToAction("Index", "Listing", listings); 
    } 

下面顯示了就要到了爲空的參數。

 public ActionResult Index(List<Listing> listing) 
    { 
     var model = new ListListingsViewModel(); 
     IEnumerable<ListingCategory> categories = _service.ListAllEntities<ListingCategory>(); 

     if (categories != null) 
     { 
      model.Categories = 
       categories.Select(
        cat => 
        new SelectListItem 
         { 
          Text = 
           cat.GetTranslation(stringA, 
                stringB).Name, 
          Value = cat.Guid.ToString() 
         }).ToList(); 
     } 
     model.Listings = listing ?? _service.ListAllEntities<Listing>(); 

     return View(model); 
    } 

EDIT

錯誤消息:

具有密鑰的ViewData項 'SelectedCategoryGuid' 的類型爲 '的System.Guid',但必須是類型爲 'IEnumerable的'。

開:

@Html.DropDownListFor(
m => m.SelectedCategoryGuid, 
Model.Categories, 
"Select a Category", 
new { 
    id = "hhh", 
    data_url = Url.Action("SortListing", "Listing") 
} 
) 

回答

2

RedirectToAction方法返回一個HTTP 302響應於所述瀏覽器,這會導致瀏覽器進行GET請求來指定的操作。

請記住HTTP是無狀態的。你不能像這樣傳遞這樣複雜的對象。

您應該傳遞查詢字符串(Id)並再次獲取第二個操作中的值或將數據保存在調用之間的persitant媒體中。您可以考慮使用會話或TempData(會話是備份的存儲)。

http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications

編輯:按註釋。是的,您可以從第一種方法本身調用視圖。下面的代碼將傳遞字符串集合Index視圖(index.cshtml)。

public ActionResult SortedList(string categoryGuid) 
{ 
    var listings = new List<Listing>(); 
    //fill the collection from the data from your db 
    return View("Index",listings) 
} 

如果你想將數據傳遞給視圖在不同的控制器,可以調用瀏覽方法時指定的完整路徑。

return View("~/Views/User/Details.cshtml",listings) 

假設你的看法是強類型到strings列表這樣

@model List<string> 
foreach(var item in Model) 
{ 
<p>@item</p> 
} 
+0

您好。我喜歡你的查詢字符串的第一個例子。你能否通知我如何做到這一點?你能否告訴我是否可以從第一種方法調用View,因爲我不需要第二種方法叫 – Subby

+0

@Subby:是的。看到我更新的答案。 – Shyju

+0

嘿Shyju。請檢查我的更新是否有新錯誤 – Subby