从多对象ViewModel中选择特定项
本文关键字:选择 多对象 ViewModel | 更新日期: 2023-09-27 18:15:15
我有一个ViewModel,它包装了两个不同对象的列表:List<Review>
和List<DayCommentary>
到ReviewViewModel
。List<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
期间张贴回控制器?
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查询只返回一个对象—您不能将文本区域绑定到列表。