2012-02-22 29 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

相关问题