在列表中返回多个对象属性

本文关键字:对象 属性 返回 列表 | 更新日期: 2023-09-27 18:13:23

我能够通过ViewBag.Categories返回CategoryName字段到列表中。我还想返回CategoryId字段,并使用它来动态构建类别详细信息视图URL

这是控制器的动作:

public ActionResult Details(Item item)
{
    var db = new appContext();
    ViewBag.Item = item.ItemTitle;
    ViewBag.ItemLink = "http://localhost:4444/Items/Details/" + item.ItemId;
    ViewBag.Categories = new List<string>(item.Categories.Select(c => c.CategoryName));
    return View();
}

这是返回类别列表的视图:

@foreach (string category in ViewBag.Categories)
{
    <li>
        <a href="http://localhost:4444/Categories/Details/???">@category</a>
    </li>
}

我如何返回CategoryId如上所示?

在列表中返回多个对象属性

使用自定义类来存储类别:

public class CategoryViewModel
{
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
}

像这样赋值:

ViewBag.Categories = item.Categories
    .Select(c => 
        new CategoryViewModel 
        { 
            CategoryId = c.CategoryId, 
            CategoryName = c.CategoryName
        }).ToList();

在你的视图中这样使用:

@foreach (CategoryViewModel category in ViewBag.Categories)
{
    <li>
        <a href="http://localhost:4444/Categories/Details/@category.CategoryId">@category.CategoryName</a>
    </li>
}

您可以使用匿名类型来实现这一点:

public ActionResult Details(Item item)
{
    var db = new appContext();
    ViewBag.Item = item.ItemTitle;
    ViewBag.ItemLink = "http://.../Items/Details/" + item.ItemId;
    ViewBag.Categories = item.Categories.Select(c => new { c.CategoryName, c.CategoryId });
    return View();
}

那么在你看来:

@foreach (var category in ViewBag.Categories)
{
    <li>
        <a href="http://localhost:4444/Categories/Details/@(category.CategoryId)">@category.CategoryName</a>
    </li>
}

但是,您可能需要考虑用强类型模型替换ViewBag。它提供了很多好处——包括智能感知支持。

可以用:

代替List<string>
List<Tuple<int, string>>

ViewBag.Categories = item.Categories.Select(cat => 
       Tuple.Create(cat.CategoryID, cat.CategoryName)).ToList();

像这样定义一个视图模型:

 public class CustomViewModel
    {
        public string Item { get; set; }
        public string Title { get; set; }
        public Categories Categories { get; set; }
    }
    public class Categories
    {
        public int Id { get; set; }
        public string CategoryName { get; set; }
    }
    public ActionResult Details(Item item)
    {
        var db = new appContext();
        var model = new CustomViewModel{
            Item = item.ItemTitle,
            ItemLink = "http://localhost:4444/Items/Details/" + item.ItemId,
            Categories = (item.Categories.Select(c => 
                new Categories{ Id = c.Id,CategoryName= c.CategoryName})).ToList()
        };
        return View(model);
    }

和视图:

   @model Categories
   @foreach (Categories category in Model.Categories)
    {
      <li>
        <a href="http://localhost:4444/Categories/Details/@category.CategoryId">@category.CategoryName</a>
     </li>
    }