Linq在htmlhelper中获取项目集合

时间:2016-12-13 18:28:33

标签: asp.net-mvc linq

我在视图中有一个hiddenfor帮助器,我希望传递一个子集合。我希望能够订购该集合,然后在hiddenfor中获取我想要的属性。

这就是我想要做的。

@Html.HiddenFor(m => m.Licenses.OrderByDescending(x => x.IssueDate).FirstOrDefault().Active)

这只是呈现Model.Active而不是Model.Licenses [index] .Active

有没有办法在佣工中使用这样的Linq,还是需要创建自定义助手?

1 个答案:

答案 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 ) 集合可能为空,您也需要处理它。