由于无法提出正确的搜索字词,我一直在努力研究这个问题的答案。
基本上我的控制器中有2个IEnumerable<T>
,下面是我尝试的代码。
控制器:
IEnumerable<Room> allRooms = RoomHelper.FindAllRooms();
foreach (var room in allRooms)
{
IEnumerable<Bunk> associatedBunks = RoomHelper.FindAssociatedBunksByRoom(room);
if (associatedBunks.Count() > 0)
{
ViewData["Room_"+room.RoomId] = associatedBunks;
}
}
我正在尝试将它们发送到视图中,我可以执行两个foreach
循环,循环遍历一组数据(在本例中为Room
个对象,然后使用Room.RoomId
密钥循环通过另一个包含关联数据的IEnumerable
。
我的观点看起来像是这样但显示了解析错误:
@foreach (var room in ViewBag.Rooms)
{
<h2>@room.RoomName</h2>
@if (ViewData["Room_" + room.RoomId].Count() > 0)
{
<ol>
@foreach (var bunk in ViewData["Room_" + room.RoomId])
{
<li>@bunk.BunkId</li>
}
</ol>
}
}
我在HTML中寻找的最终结果是:
<h2>Room 1</h2>
<ol>
<li>Bunk 1</li>
<li>Bunk 2</li>
</ol>
<h2>Room 2</h2>
<ol>
<li>Bunk 3</li>
<li>Bunk 4</li>
</ol>
使用EF5的ASP.NET MVC 4中传递“多维”(这是多维?)数据时实现这种结果的最佳做法是什么?
答案 0 :(得分:3)
不要依赖ViewData
。将要传递的数据存储到适当的ViewModel
:
public class RoomViewModel
{
List<Room> Rooms { get; set;}
...
}
将您的数据存储在其中一个中。
您的Controller方法然后返回它的实例:
public RoomViewModel GetRooms(int someParameter)
{
RoomViewModel result = new RoomViewModel();
result.Rooms = RoomHelper.Something(someParameter);
...
return result;
}
您的View
在顶部声明其模型:
@model MyApplication.ViewModels.RoomViewModel
因此您可以在View
中使用它。
<h2>@Model.Rooms.Count rooms found</h2>
等
答案 1 :(得分:0)
在视图中使用代码块,而不是在每个C#语句前添加“@”:
@{
foreach (var room in ViewBag.Rooms)
{
@Html.Raw("<h2>" + room.RoomName + "</h2>");
if (ViewData["Room_" + room.RoomId].Count() > 0)
{
@Html.Raw("<ol>");
foreach (var bunk in ViewData["Room_" + room.RoomId])
{
@Html.Raw("<li>" + bunk.BunkId + "</li>");
}
@Html.Raw("</ol>");
}
}
}
您应该尽可能避免使用@HtmlRaw(“”),因为它有XSS漏洞。但这应该让你走上正轨。
答案 2 :(得分:0)
根据您的描述,Bunk似乎与房间相关联。如果是这种情况,那么Bunk可能有一些id用于指向它所属的房间。现在您可以像这样创建一个ViewModel
public class BunkViewModel:Bunk
{
public BunkViewModel()
{
Mapper.CreateMap<Bunk,BunkViewModel>();
}
//I'm assuming that you already have some id in bunk to point to room it belongs.
//But writing it here to make it clear
public int RoomId { get; set; }
public string RoomName { get; set; }
//Use AutoMapper to Map
public static BunkViewModel Map(Bunk source)
{
return Mapper.Map<Bunk,BunkViewModel>(source);
}
}
现在在您的控制器中
public ActionResult ActionName()
{
var result = new List<BunkViewModel>();
var rooms = RoomHelper.FindAllRooms();
var bunks = BunkHelper.GetAllBunks();
foreach(var bunk in bunks)
{
var bunkViewModel = BunkViewModel.Map(bunk);
var room = rooms.FirstorDefault(r=>room.RoomId == bunk.RoomId);
bunkViewModel.RoomId = room.RoomId; //No need to set if you already have this id in bunk
bunkViewModel.RoomName = room.RoomName;
result.Add(bunkViewModel);
}
return View(result.);
}
现在在你看来你可以这样做
@model List<MyApplication.ViewModels.RoomViewModel>
@foreach(var bunk in Model)
{
//Print it here as you want..
}