我有类似的东西
public class ViewModel
{
public List<Books> Test {get; set;}
public SelectList List {get; set;}
public ViewModel()
{
Test = new List<Books>();
}
}
public class Books
{
public string SelectedItemFromList {get; set;}
public int forTextbox {get; set;}
}
view
<% for (int i = 0; i < 1; i++)
{ %>
<%: Html.DropDownListFor(m => ViewModel.Books[i].SelectedItemFromList, SelectList ); // works no error
<%: Html.TextBoxFor( m => ViewModel.Books[i].forTextBox) // fails range exception.
<% } %>
我觉得奇怪的是下拉列表有效但文本框没有。为了使文本框工作,我必须这样做
Public ViewModel()
{
Test = new List<Books>();
Test.add(new Books() { forTextbox = 1});
}
这是有道理的,因为在我向视图传递一个空的书籍清单之前,它只是奇怪的,它适用于一个而不是另一个。我认为两者都会失败。
答案 0 :(得分:2)
我猜测DropDownListFor
对页面渲染时的项目没有任何作用,它等待页面回发(例如它没有评估它,因此没有索引超出范围异常)。 TextBoxFor尝试获取值并将其放在页面上,因此需要在页面渲染时评估m=>ViewModel.Books[i].forTextBox
。
编辑: 好的,我更接近菲尔的东西。他的方法非常复杂,如果没有完全看到你的观点,你就会更难以找出你的分歧。
但最终,我猜我的回答仍然存在。
但是我对这种符号感到有点困惑:
m => ViewModel.Books[i].forTextBox
我之前没有看过像这样的lambda符号。这真的是它在你的代码中看起来如何,或者当你在StackO中键入它时会丢失一些东西吗?
我本来期待的东西看起来更像是:
m => m[i].forTextbox
或者,甚至可能:
m => m.Books[i].forTextBox
但不知道你的观点是继承的,我有点不知所措。