0

我将一个List<Listing>对象传递给另一个操作方法,并使该方法使用参数调用 View。

出于某种原因,我传递的参数为空。

以下工作正常:

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

编辑

错误信息:

具有键“SelectedCategoryGuid”的 ViewData 项属于“System.Guid”类型,但必须属于“IEnumerable”类型。

在:

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

1 回答 1

2

RedirectToAction方法向浏览器返回一个 Http 302 响应,这导致浏览器向指定的操作发出 GET 请求。

记住HTTP 是无状态的。你不能像那样传递如此复杂的对象。

您应该传递一个查询字符串(一个 Id)并再次获取第二个操作中的值,或者在调用之间将数据保存在持久性介质中。您可以考虑为此使用 Session 或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)
}

如果要将数据传递给不同控制器中的视图,可以在调用 View 方法时指定完整路径。

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

假设您的视图被强输入到这样的列表strings

@model List<string>
foreach(var item in Model)
{
 <p>@item</p>
}
于 2012-09-18T19:30:25.203 回答