通过我的视图模型循环获取模板错误

时间:2014-03-05 17:24:02

标签: c# asp.net-mvc entity-framework

在我的视图模型中,我有以下内容:

List<Question> QuestionSet
List<Answer> SelfEvaluation
List<Answer> PeerEvaluation

我在控制器中加载视图模型Answer有一个外键到AnswerDetail。我正在使用实体框架。

在我的视图中,我正在循环浏览QuestionSet

然后我有这条线:

@Html.Bootstrap().TextAreaFor(m=>m.SelfEvaluation.Select(se=>se.AnswerDetails.Where(ad => ad.QuestionID == item.QuestionID).Select(x=>x.Comment)))

我收到了这个错误:

  

模板只能用于字段访问,属性访问,   单维数组索引或单参数自定义索引器   表达式。

我想在表格中并排列出问题和评论。我需要在模型,视图或控制器中更改哪些内容才能适应这种情况?

1 个答案:

答案 0 :(得分:2)

首先,我建议您将您的EF模型绑定到您的视图,而是创建单独的ViewModel。这会将您的域从您的演示文稿中抽象出来,并防止未使用的数据进入您的视图。最重要的是,如果您在操作方法中接受EF模型,它会阻止将非预期的数据发回您的控制器。

其次,我还建议您从视图中删除一些过滤/映射逻辑。您的控制器应负责准备ViewModel并正确发送 您的视图所需的数据。您的视图根本不应该这样做 - 它应该完全按原样使用ViewModel,并将数据呈现给浏览器。

现在关于你的异常,这可能是因为TextAreaFor()它正在期待来自lambda的模型属性,但是你给它一个值(参见documentation)。例如,你不能这样做:

@Html.Bootstrap().TextAreaFor("My comment.")

但这基本上就是你通过给Linq查询的结果给出一个Comment值而不是给它属性(m =&gt; m.Comment)。

我建议重构你的ViewModel以使用简单的数据类型,并在控制器中保存这些ViewModel,就像我上面提到的那样,在将它们交给视图之前进行所有的过滤和映射。

一旦你这样做,如果你需要渲染多个AnswerModel,那么这些应该有相应的EditorTemplates:

@model AnswerModel
@Html.Bootstrap().TextAreaFor(m => m.Comment)

然后在您的视图中,您可以简单地为主视图渲染多个答案,如下所示:

@model MainModel
@Html.EditorFor(m => m.SelfEvaluation)

(有关MVC模板的更多信息并通过它们循环,请参阅this answer。)

您可以看到,这使您的观点更多更清晰,更容易理解。