我在视图中有一个hiddenfor帮助器,我希望传递一个子集合。我希望能够订购该集合,然后在hiddenfor中获取我想要的属性。
这就是我想要做的。
@Html.HiddenFor(m => m.Licenses.OrderByDescending(x => x.IssueDate).FirstOrDefault().Active)
这只是呈现Model.Active而不是Model.Licenses [index] .Active
有没有办法在佣工中使用这样的Linq,还是需要创建自定义助手?
答案 0 :(得分:1)
用作Expression<>
方法的参数的Html.BlarghFor()
需要是一个简单的表达式,就像属性 - getter调用一样,并且不能涉及任何方法调用。这就是ASP.NET MVC中的模型绑定器的工作方式。
您的ViewModel不应该是实体框架实体对象,而是特定于该视图的类,它应该只包含标量值,嵌套视图模型和普通集合(数组,List<T>
和{{ 1}} - 所以不在ViewModel中使用Dictionary<TKey,TValue>
或IQueryable
- 再次,这与模型绑定器的工作方式有关。
一种解决方案是在控制器中按IEnumerable
预先排序m.Licenses
:
IssueDate
在你看来:
[...]
viewModel.Licenses.Sort( (x,y) => x.IssueDate.CompareTo( y.IssueDate ) );
return this.View( viewModel );
另一个选择是找到所需元素的索引,然后在@Html.HiddenFor( m => m.Licenses[ m.Licenses.Count - 1 ].Active )
参数中使用它。
不幸的是,Linq并没有带来&#34;最大/最小指数&#34;功能,您可以编写自己的(从这里:How do I get the index of the highest value in an array using LINQ?),或手动执行:
Expression<>
如果@{
// at the start of your view:
Int32 indexOfMostRecent = -1;
DateTime mostRecent = DateTime.MinValue;
for( Int32 i = 0; i < this.Model.Licenses.Count; i++ ) {
if( this.Model.Licenses[i].IssueDate > mostRecent ) {
indexOfMostRecent = i;
mostRecent = this.Model.Licenses[i].IssueDate;
}
}
}
@Html.HiddenFor( m => m.Licenses[ indexOfMostRecent ].Active )
集合可能为空,您也需要处理它。