将复杂数据发送到ASP MVC视图

时间:2013-11-25 12:54:23

标签: c# asp.net asp.net-mvc asp.net-mvc-4

由于无法提出正确的搜索字词,我一直在努力研究这个问题的答案。

基本上我的控制器中有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中传递“多维”(这是多维?)数据时实现这种结果的最佳做法是什么?

3 个答案:

答案 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..
}