首页 新闻 搜索 专区 学院

MVC3中,使用ViewModel出错,有错误信息,困惑很久,麻烦大侠们搭把手。

0
悬赏园豆:50 [已解决问题] 解决于 2011-08-06 17:22

在ArticleController中名为Index的ActionResult点右键,添加VIEW,名称为Index,创建强类型视类,Model Class设为ArticleViewModel,选择List模板,运行出错,

刚开始,ActionResult代码如下:

 public ActionResult Index()
        {
            ICriteria cr = new EqualCriteria("CommentEnable", true);
 
            IEnumerable<Article> list = _articleRepocitory.GetMany(cr);
            return View(list);
        }

运行错误信息:
 
传入字典的模型项的类型为“System.Data.Objects.ObjectQuery`1[EIS.Models.Article]”,但此字典需要类型“System.Collections.Generic.IEnumerable`1[EIS.Models.ArticleViewModel]”的模型项。
 
----------------------------------------------------

心想,这个类型错了,改吧

代码如下:

 public ActionResult Index()
        {
            ICriteria cr = new EqualCriteria("CommentEnable", true);
            IQueryable<Article> list = _articleRepocitory.GetMany(cr);
            var vm = new ArticleViewModel();
            ModelCopier.CopyModel(list, vm);
            return View(vm);
        }

运行再错,信息如下

 
传入字典的模型项的类型为“EIS.Models.ArticleViewModel”,但此字典需要类型“System.Collections.Generic.IEnumerable`1[EIS.Models.ArticleViewModel]”的模型项。

 

请问一下这个怎么解决?

BorgChen的主页 BorgChen | 初学一级 | 园豆:11
提问于:2011-08-05 12:51
< >
分享
最佳答案
0

第一段代码的错误很明显的,你试图view的强类型是IEnumerable<ArticleViewModel>,而传入的类型却是IEnumerable<Article>,这样明显不对。也就是说IEnumerable<Article> list = _articleRepocitory.GetMany(cr);
这句代码有错,要么改成IEnumerable<ArticleViewModel> list = _articleRepocitory.GetMany(cr);//不过GetMany这个方法的返回值必须支持这样的类型转换

第二段代码问题,你也晓得了是类型不同引起的,但是你还是没把类型改对。 var vm = new ArticleViewModel();
ModelCopier.CopyModel(list, vm);
这个两句代码要这么个修改,var vm = new IEnumerable<ArticleViewModel>();  //这个CopyModel方法我想你要实现的是从IEnumerable<Article>类型转换成IEnumerable<ArticleViewModel>类型,但是从你的代码上看却是从IEnumerable<Article>类型转换成ArticleViewModel,这个就是问题所在。将你的CopyModel这个方法写好,然后var vm = new IEnumerable<ArticleViewModel>();  ModelCopier.CopyModel(list, vm);

这样就差不多了

收获园豆:40
悠然自得 | 初学一级 |园豆:141 | 2011-08-05 19:32
谢谢你的回答,不过能不能再帮一下?
ModelCopier.CopyModel(from,to);
这个方法来自Microsoft.Web.Mvc,用来实现模型映射。
不知道换你来写的话是怎么实现的?
BorgChen | 园豆:11 (初学一级) | 2011-08-05 20:19
好像园子里关于模型映射的贴子不多,mvc in action里也没有具体的例子。
BorgChen | 园豆:11 (初学一级) | 2011-08-05 20:21
这个简单啊,要么你就把视图的强类型IEnumerablel换成IEnumerable
;
另一个就是你所用的方法ModelCopier.CopyModel(from,to),这个方法只是支持单一的转换,ModelCopier.CopyCollection这个方法才是以集合为单位进行转换的。

不过还是建议自己写转换, 不难的。
public ActionResult Index()
{
ICriteria cr = new EqualCriteria("CommentEnable", true);
IQueryable
list = _articleRepocitory.GetMany(cr);
var vm = new List();
foreach (var item in list)
{
ArticleViewModel tt = new ArticleViewModel();
tt.ziduan(字段) = item.ziduan(字段);//这里是将他们对应字段赋值
...
vm.Add(tt);
}
return View(vm);
}
xanthodont | 园豆:103 (初学一级) | 2011-08-05 20:56
少了一点东西,将vm转为IEnumable类型
xanthodont | 园豆:103 (初学一级) | 2011-08-05 21:34
这个,就是敲的代码有点多,能映射的话多好。
问题又来了
ModelCopier.CopyCollection(from,to)方法里的to是要icollection接口
我基础不好,汗的
BorgChen | 园豆:11 (初学一级) | 2011-08-05 22:40
建议还是敲代码吧,它的意思是要你的vm 变量实现icollection接口,不过你也可以用现成的,把那句代码改成var vm = new IList(); //IList这个接口实现了ICollection

CopyCollection这个方法没用过,不知道这么行不行
xanthodont | 园豆:103 (初学一级) | 2011-08-05 23:28
这样不行,前一句直接就无法创建抽象类或接口
BorgChen | 园豆:11 (初学一级) | 2011-08-05 23:52
其他回答(3)
0

return View(vm);  这里错了,这里应该传入 IEnumerable<ArticleViewModel> 类型.

收获园豆:10
Launcher | 园豆:45045 (高人七级) | 2011-08-05 13:18
能具体说一下怎么做吗?代码里,我不是已经将IQueryable
类型的list复制给vm了吗?
支持(0) 反对(0) BorgChen | 园豆:11 (初学一级) | 2011-08-05 13:22
@tiaru:
var vm = new ListModelCopier.CopyModeel(list,vm);
return View(vm);
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2011-08-05 14:33
麻烦再问一下,ListModelCopier.CopyModel(,)这个引用自哪儿?
支持(0) 反对(0) BorgChen | 园豆:11 (初学一级) | 2011-08-05 17:43
0

你加我QQ吧,我帮你看看314059325

xanthodont | 园豆:103 (初学一级) | 2011-08-05 23:56
加了,你有空再呼我。谢谢哈。
支持(0) 反对(0) BorgChen | 园豆:11 (初学一级) | 2011-08-06 11:08
0

你的view引用的类型也得是  IEnumerable<Article> 才可以

慧☆星 | 园豆:5566 (大侠五级) | 2011-08-06 09:01
View自动生成时就是IEnumerable,之前Repository我用的是IQueryable,为此另加了IEnumerable的接口及实现,代码里用的就是了。
支持(0) 反对(0) BorgChen | 园豆:11 (初学一级) | 2011-08-06 11:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册