C# 在HtmlHelper中使用LINQ在@foreach外部绑定集合的特定项

C# 在HtmlHelper中使用LINQ在@foreach外部绑定集合的特定项,c#,asp.net-mvc,linq,razor,asp.net-mvc-5,C#,Asp.net Mvc,Linq,Razor,Asp.net Mvc 5,我使用的是MVC5。假设我有一个包含集合的ViewModel,如下所示: public class MyViewModel { public ICollection<MyItem> MyItems { get; set; } } @Html.TextBoxFor(x => x.MyItems.First(y => y.Name == "Hello").Id) 当然,这段代码是无效的,但是有没有一种方法可以达到同样的效果,比如创建一个定制的HtmlHelper?

我使用的是MVC5。假设我有一个包含集合的ViewModel,如下所示:

public class MyViewModel
{
    public ICollection<MyItem> MyItems { get; set; }
}
@Html.TextBoxFor(x => x.MyItems.First(y => y.Name == "Hello").Id)

当然,这段代码是无效的,但是有没有一种方法可以达到同样的效果,比如创建一个定制的HtmlHelper?

我想我理解你在做什么,但从你最初的帖子中还不太清楚。为什么不将完整的列表发送到视图,只需迭代列表中的所有项目,然后按照您想要的方式绑定每个项目呢。这是一个可能对你有用的老链接

我想我理解你在做什么,但从你原来的帖子中还不太清楚。为什么不将完整的列表发送到视图,只需迭代列表中的所有项目,然后按照您想要的方式绑定每个项目呢。这是一个可能对您有用的旧链接

一种方法是将
ICollection
更改为
IList
,然后在您看来:

var myItemIndex = Model.MyItems.IndexOf(Model.MyItems.First(y => y.Name == "Hello"));
@Html.TextBoxFor(x => x.MyItems[myItemIndex].Id)

一种方法是将
ICollection
更改为
IList
,然后在您看来:

var myItemIndex = Model.MyItems.IndexOf(Model.MyItems.First(y => y.Name == "Hello"));
@Html.TextBoxFor(x => x.MyItems[myItemIndex].Id)

在viewmodel中创建第二个属性,getter为x.MyItems.First(y=>y.Name==“Hello”)怎么样。尝试绑定到视图中的数据类型时,您还可以将
MyItems
装饰为自定义
DataType
,并提供
EditorTemplate
来处理集合。自定义助手应该可以工作too@Fran我对这种方法很感兴趣,但你能再详细说明一下吗?也许举个简单的例子?我自己无法使其工作。因此,在MyViewModel中添加一个新属性public MyItem MySpecialItem{get{return MyItems.First(y=>y.Name==“Hello”}唯一的问题是你试图在一个对象上创建一个textboxfor,而不是一个对象的属性。我想我理解你在做什么,但从你的原始帖子中还不太清楚。为什么不将完整的列表发送到视图,只需迭代列表中的所有项目,然后按照你想要的方式绑定每个项目。这是一个旧链接h可能适合您,在viewmodel中创建第二个属性,getter为x.MyItems.First(y=>y.Name==“Hello”)怎么样。并尝试在视图中绑定到该对象。您还可以将
MyItems
装饰为自定义
DataType
,并提供
EditorTemplate
来处理集合。自定义帮助器应该可以工作too@Fran我对这种方法很感兴趣,但你能不能再详细一点?也许可以举个简单的例子?我自己无法使其工作。因此,在MyViewModel中添加一个新属性public MyItem MySpecialItem{get{return MyItems.First(y=>y.Name==“Hello”}唯一的问题是你试图在一个对象上创建一个textboxfor,而不是一个对象的属性。我想我理解你在做什么,但从你的原始帖子中还不太清楚。为什么不将完整的列表发送到视图,只需迭代列表中的所有项目,然后按照你想要的方式绑定每个项目。这是一个旧链接他可能为你工作