2015-11-15 44 views
0

我試圖用視圖模型查看視圖中兩個表中的信息,但它不起作用。ViewModel無法正常工作。從兩個表中顯示

這給出了兩個表的信息。

public class HeatImage 
{ 
    [Key] 
    public int ImageId { get; set; } 
    public string name { get; set; } 
} 

public class HeatingArea 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Area { get; set; } 

} 

我的視圖模型

public class HeatingAreaViewModel 
{ 
    public IEnumerable<HeatImage> heatingImage { get; set; } 
    public IEnumerable<HeatingArea> heatingArea { get; set; } 
} 

我控制器

public ActionResult Index() 
     { 
      HeatingAreaViewModel mymodel = new HeatingAreaViewModel(); 
      mymodel.heatingArea = db.HeatingAreas.ToList(); 
      mymodel.heatingImage = db.HeatImages.ToList(); 

      return View(mymodel); 
     } 

而且我認爲

@model IEnumerable<Project.Models.HeatingAreaViewModel> 
@foreach (var item in Model) 
      { 
       <a href="~/folder/@item.heatingImage">@item.heatingArea</a> 
      } 

錯誤

傳遞到詞典中的模型項的類型 「Project.Models.HeatingAreaViewModel」的,但是這需要字典類型 的 模型項「System.Collections.Generic.IEnumerable`1 [Project.Models.HeatingAreaViewModel] 」。

+1

順便說一句,MVC下它被稱爲_model_ ** **不_ 「視圖模型」 _。 https://msdn.microsoft.com/en-us/library/dd381412(v=vs.108).aspx – MickyD

+2

@Micky,有Models和ViewModels。看到這篇文章:[MVC中的ViewModel是什麼?](http://stackoverflow.com/a/11074506/1454538) – mezmi

+1

@ᴉʞuǝ感謝提到我的文章/回答 –

回答

0

您的看法期待一個IEAumerable的HeatingAreaViewModel,它看起來好像你只傳遞一個實例。

更改此

@model IEnumerable<Project.Models.HeatingAreaViewModel> 

這個

@model Project.Models.HeatingAreaViewModel 

然後你就可以遍歷heatingAreaheatingImage這類似

@foreach (var item in model.heatingArea) 
{ 
    //what ever you need to do here 
} 
+0

謝謝,但我怎樣才能在同一迴路中同時獲得heatingArea和heatingImage?我想創建這個鏈接'@item.heatingArea' – Xtreme

+1

我不確定你可以在一個循環中迭代兩個IEnumerables。你能解釋一下你到底想做什麼嗎? 'heatingImage'和'heatingArea'是兩個單獨的列表。 – mezmi

+0

@Xtreme,哦,所以你試圖解決一個不同的問題,如何把兩個列表放在一起,而不是如何在MVC視圖中顯示它,我要寫第二個答案,看到一個解決方案並進一步評論。 – Dano

1

錯誤消息告訴它:該視圖預計的,而您的控制器操作只發送到視圖HeatingAreaViewModel

因此,要麼糾正控制器發送一個HeatingAreaViewModel列表,或更正視圖,以期望只有一個實例HeatingAreaViewModel

+0

我該如何更換我的控制器? – Xtreme

+0

@Xtreme,你不改變控制器,你改變視圖爲'model Project.Models.HeatingAreaViewModel',然後'@foreach(Model.heatingImage中的var item)'和/或'@foreach(Model in Model .heatingArea)' –

0

如果你的問題是,如何在一個循環中通過HeatingImageHeatingArea兩個列表迭代,在你看來,你必須重做視圖模型:

public class HeatingAreaViewModel 
{ 
    public HeatImage heatingImage { get; set; } 
    public HeatingArea heatingArea { get; set; } 
} 

,然後控制器動作:

public ActionResult Index() 
      { 
       heatingAreas = db.HeatingAreas.ToList(); 
       heatingImages = db.HeatImages.ToList(); 

       List<HeatingAreaViewModel> myModel = heatingAreas.Zip(heatingImages, (a, b) => new HeatingAreaViewModel {HeatingArea = a, HeatImage = b}) 

       return View(mymodel); 
      } 

然後,視圖將照原樣工作。

但是,我強烈建議不要這樣做。您必須確保兩個列表中的相應元素實際上相互對應。這很容易出錯。如果有一個將這兩個列表綁定在一起的底層邏輯(數據庫表格上有一些關係),我將使用該邏輯將列表/表格連接在一起。

0

只需將您的視圖模型不符合您的控制器操作發送的內容,所以我認爲你需要改變你的看法是這樣的:

@model HeatingAreaViewModel 
@foreach (var item in Model.heatingImage) 
{ 
    <a href="~/folder/@item.heatingImage">@item.heatingArea</a> 
} 
1

您通過appels並期待橘子發送,這就是你得到錯誤的原因。

在您的控制器中,您通過一個(一個)HeatingAreaViewModel實例發送。在您看來,您正在爲除了HeatingAreaViewModel實例(超過1個)的列表作出規定。

閱讀您希望在每次循環迭代中使用HeatImageHeatingArea的回覆。您將需要更改視圖模型以適應此情況。例如,創建一個可以同時容納一個視圖模型:

public class HeatViewModel 
{ 
    public HeatImage HeatImage { get; set; } 

    public HeatingArea HeatingArea { get; set; } 
} 

您將通過此HeatViewModel的列表視圖。

public ActionResult Index() 
{ 
    // This is just dummy code 
    HeatingViewModel model1 = new HeatingAreaViewModel(); 
    // Populate the properties 
    model1.HeatImage = new HeatImage(); 
    // Populate the properties 
    model1.HeatingArea = new HeatingArea(); 

    HeatingViewModel model2 = new HeatingAreaViewModel(); 
    // Populate the properties 
    model2.HeatImage = new HeatImage(); 
    // Populate the properties 
    model2.HeatingArea = new HeatingArea(); 

    // Now pass this list to the view 
    List<HeatingViewModel> models = new List<HeatingViewModel>(); 

    return View(models); 
} 

您認爲您的代碼會是這個樣子:

@model List<Project.Models.HeatingViewModel> 
@foreach (var item in Model) 
{ 
    <p>item.HeatImage.Name</p> 
    <p>item.HeatingArea.ID (I have used ID because I don't know what your Area looks like)</p> 
} 

這種方式,你有一個循環的兩個對象。你只需要去弄清楚你將如何填充它們,這是大部分工作將完成的地方。

我還注意到,你以小寫字母開始你的屬性,最佳做法是用大寫字母開頭。例如:

public HeatImage heatImage { get; set; } 

...應該是...

public HeatImage HeatImage { get; set; } 

我希望這有助於:)