2013-11-25 77 views
0

我一直在努力研究這個問題的答案,因爲我無法拿出正確的搜索條件。發送複雜數據到ASP MVC視圖

基本上我有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對象和然後將通過另一個IEnumerable它包含了相關的數據使用Room.RoomId關鍵週期

我的看法是這樣的,但正顯示出解析錯誤:

@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> 

什麼是ASP.NET MVC 4 EF5最佳實踐通過「多維」時實現這種結果(這是多維的?)數據?

+0

我想我失去了一些東西,當它在視圖中使用'@'語法。 –

+0

我會認爲,只要您需要將一些複雜的數據發送到視圖,您應該專門爲視圖創建一個ViewModel,以滿足視圖需要。 – Tobberoth

回答

3

不要依靠ViewData。存儲您要傳遞到您的視圖在一個適當的ViewModel數據:

public class RoomViewModel 
{ 
    List<Room> Rooms { get; set;} 

    ... 
} 

Store中的那些的一個數據。

控制器方法然後返回它的一個實例:

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> 

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漏洞。但是,這應該讓你走上正軌。

0

根據您給出的描述,Bunk似乎與房間相關聯。如果是這種情況,那麼Bunk可能會有一些ID指向它所屬的房間。現在你可以在你的控制器創建這樣

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

一個ViewModel現在

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