为什么这样做?

时间:2010-07-11 21:07:18

标签: c# asp.net-mvc-2

我有类似的东西

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});
}

这是有道理的,因为在我向视图传递一个空的书籍清单之前,它只是奇怪的,它适用于一个而不是另一个。我认为两者都会失败。

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

但不知道你的观点是继承的,我有点不知所措。