从多对象ViewModel中选择特定项

本文关键字:选择 多对象 ViewModel | 更新日期: 2023-09-27 18:15:15

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

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

我尝试用下面的代码来实现这一点,在运行时抛出一个错误:

@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期间张贴回控制器?

从多对象ViewModel中选择特定项

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

这是没有意义的,因为它将返回一个bool集合。

也许你的意思是

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

如果您想为DayCommentary集合中的每个元素设置一个文本区域,则在该集合上使用foreach循环。让我知道,如果你不确定如何做到这一点,我会很高兴地添加一些示例代码到我的答案。

如何使用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查询只返回一个对象—您不能将文本区域绑定到列表。