收录日期:2019/09/19 00:16:51 时间:2010-07-11 21:07:18 标签:c#,asp.net-mvc-2

I have something like this

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.
        <% } %> 

I find it odd that the dropdownlist works but the textbox does not. To make the textbox work I would have to do this

Public ViewModel()
{
  Test = new List<Books>();
  Test.add(new Books() { forTextbox = 1});
}

This makes sense to be because before I was passing to the view an empty list of books but it just so odd that it works for one and not the other. I would think both would fail.

I'm guessing that the DropDownListFor doesn't do anything to the item at page render, it waits until the page is posted back (e.g. it doesn't evaluate it, so no index out of range exception). The TextBoxFor tries to get the value and put it on the page, so it needs to evaluate m=>ViewModel.Books[i].forTextBox at page render.

Edit: Ok, I read Phil's stuff a little closer. His approach is pretty complex, and without seeing your view in (most of) its entirety, it becomes more difficult to figure out where you diverged.

Ultimately, however, I would guess that my answer still stands.

I am a bit confused about this notation, however:

m => ViewModel.Books[i].forTextBox

I haven't seen lambda notation like that before. Is that really how it looks in your code, or is did something get lost when you typed it into StackO?

I would have expected something that looks more along the lines of:

 m => m[i].forTextbox

or, maybe even:

 m => m.Books[i].forTextBox

but without knowing what your view is inheriting from, I'm at a bit of a loss.