在列表中返回多个对象属性
本文关键字:对象 属性 返回 列表 | 更新日期: 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>
}