从多对象ViewModel中选择特定项

时间:2015-09-30 16:27:47

标签: c# asp.net asp.net-mvc linq asp.net-mvc-4

我有一个ViewModel,它将两个不同对象列表包括在内:List<Review>List<DayCommentary>ReviewViewModelList<DayCommentary>将始终是0,1或2个元素的集合,所有元素都具有不同的DayCommentary.CommentaryFor(字符串参数)值。

在我看来,我需要在页面的一个部分中为List<DayCommentary>中的一个元素显示一个textarea,为同一页面的另一个部分中的另一个元素显示另一个textarea。

我尝试使用下面的代码实现此目的,该代码在运行时抛出错误:

@Html.TextAreaFor(model => model.DayCommentary.Select(c => c.CommentaryFor == "Day"), 
new {@class = "form-control commentary", @style = "max-width: none"})

错误:

Templates can be used only with field access, property access, 
single-dimension array index, or single-parameter custom indexer expressions.

我认为我对LINQ select语句不满意。

实现我想要做的事情的最佳方法是什么,同时仍然绑定到模型以在FormMethod.Post期间回发到控制器?

2 个答案:

答案 0 :(得分:1)

model.DayCommentary.Select(c => c.CommentaryFor == "Day")

这不会有意义,因为它会返回一组bool。

也许你的意思是

model.DayCommentary.First(c => c.CommentaryFor == "Day").CommentaryFor

如果您想要DayCommentary集合中每个元素的文本区域,请在集合中使用foreach循环。如果您不确定如何执行此操作,请与我们联系。我很乐意在我的答案中添加一些示例代码。

答案 1 :(得分:0)

如何使用TextArea而不是TextAreaFor,它可以让您指定您想要的任何值:

@Html.TextArea("DayCommentary",
               Model.DayCommentary.Single(c => c.CommentaryFor == "Day").Text,
               new {@class = "form-control commentary", @style = "max-width: none"})

请注意,上面的代码做了很多假设。第一个参数name假定您希望在帖子上收到名为“DayCommentary”的值。第二个参数假定DayCommentary对象具有Text属性 - 显然您无法将对象本身提供给该方法。它还假设LINQ查询只返回一个对象 - 您无法将文本区域绑定到列表。