2012-02-22 65 views
3

我第一次使用EF模型和MVC使用的ViewModels,我有這個錯誤的問題:MVC:傳遞到字典的模型項目是X型的,但是這本詞典需要X型的模型項目

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[NKI3.Models.Question]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[NKI3.ViewModels.IndexCreateViewModel]'. 

這是我的視圖模型:

public class IndexCreateViewModel 
{ 
    public string QuestionText { get; set; } 
    public string Sname { get; set; } 
    public string Cname {get;set;} 
} 

這是我在我的控制器操作:

public ActionResult Index() 
{ 
    var Q = db.Question.Include(a => a.SubjectType).Include(a => a.CoreValue); 
    return View(Q.ToList()); 
} 

這裏是我的斯特龍gly typed view:

@model IEnumerable<NKI3.ViewModels.IndexCreateViewModel> 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th> 
      QuestionText 
     </th> 
     <th> 
      Sname 
     </th> 
     <th> 
      Cname 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.QuestionText) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Sname) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Cname) 
     </td> 

    </tr> 
} 

</table> 

我似乎找不到解決方案,我必須返回我的viewmodel控制器行動指數內?任何幫助表示讚賞。

在此先感謝!

最好的問候!

+0

它看起來像db.Question返回NKI3.Models.Question,而不是你上面顯示的ViewModel。 – koregan 2012-02-22 10:19:18

回答

7

請參閱:記下 是否有助於返回Enumerable?

return View(Q.AsEnumerable()); 

編輯:是的,我知道我的第一個鏡頭是錯誤的......沒注意到,您的看法想要一個

@model IEnumerable<NKI3.ViewModels.IndexCreateViewModel> 

我與其他人同意有關轉換到需要的!將值返回到匹配類型... 或調整視圖中的期望類型... 也許您可以利用映射framworks(如automapper)(http://automapper.org/)來幫助您解決映射代碼域對象和視圖模型之間。

它給你 - 無需進一步下跌的投票...

+0

我試過了,得到這個錯誤:傳遞給字典的模型項目類型爲'System.Data.Objects.ObjectQuery'1 [NKI3.Models.Question]',但是這個字典需要一個'System.Collections.Generic.IEnumerable'1 [NKI3。 ViewModels.IndexCreateViewModel]」。 – Obsivus 2012-02-22 10:21:24

+0

我不得不使用映射,但我沒有使用automapper現在它工作完美 – Obsivus 2012-02-22 15:55:06

+0

我忘了在視圖的頂部@ @ model IEnumerable <...'並得到了類似的錯誤,並不得不重新檢查我錯過了什麼。好帖子傢伙。 – 2016-01-22 17:43:49

0

是 - 該操作應返回在視圖文件的第一行中聲明的相同類型的模型。

在視圖文件更改第一行:

@model IndexCreateViewModel 

,改變你的動作代碼(Index()),以將返回IndexCreateViewModel類型的對象代碼。

+0

午餐後我會試試這個,我會報告它是怎麼回事:) – Obsivus 2012-02-22 10:27:01

+0

沒有工作,錯誤:你不能使用foreach語句來爲NKI3.ViewModels.IndexCreateViewModel類型的變量,因爲NKI3.ViewModels.IndexCreateViewModel不包含一個公共定義爲GetEnumerator – Obsivus 2012-02-22 11:24:41

+0

你應該改變'IndexCreateViewModel'是一個IEnumerable的其他東西(比如說,創建一個名爲'Question'的新類,它將成爲IEnumerable中的一個項目) – 2012-02-22 13:35:26

0

通過

db.Question.Include(a => a.SubjectType).Include(a => a.CoreValue);

返回類型看起來是IQueryable<NKI3.Models.Question>

你需要來轉換結構(您的數據模型)設置爲IEnumerable<IndexCreateViewModel>

如果您的應用程序中沒有助手要在它們之間轉換,那麼你需要寫一個。

IList<IndexCreateViewModel> viewmodel = new List<IndexCreateViewModel>(); 

foreach(NKI3.Models.Question item in Q) 
{ 
    IndexCreateViewModel viewItem = new IndexCreateViewModel(); 
    // I don't know the properties of Question. 
    viewItem.QuestionText = item.????; 
    viewItem.CName = item.???; 
    viewItem.SName =-item.???; 
    viewModel.Add(viewItem); 
} 
return View(viewModel); 
+0

問題是Question實例只有QID和QuestionText。所以ViewItem.Cname = item.Cname不會工作。 CoreValue和SubjectType實體具有Cname和Sname值。 – Obsivus 2012-02-22 11:32:48

+0

我認爲你需要退後一步,看看你的數據模型與你的視圖模型有什麼關係。 – koregan 2012-02-22 13:41:16

相關問題