Почему это работает? - PullRequest
       0

Почему это работает?

0 голосов
/ 12 июля 2010

У меня есть что-то вроде этого

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 Ответ

2 голосов
/ 12 июля 2010

Я предполагаю, что DropDownListFor ничего не делает с элементом при рендеринге страницы, он ждет, пока страница не будет отправлена ​​обратно (например, он не оценивает ее, поэтому нет индекса вне диапазона исключений).TextBoxFor пытается получить значение и поместить его на страницу, поэтому ему нужно оценить m=>ViewModel.Books[i].forTextBox при визуализации страницы.

Редактировать: Хорошо, я немного прочел материал Фила.Его подход довольно сложен, и, не видя вашего взгляда во всей его полноте, становится все труднее выяснить, где вы разошлись.

В конечном счете, однако, я предполагаю, что мой ответ все еще остается в силе.

Я немного смущен этой нотацией, однако:

m => ViewModel.Books[i].forTextBox

Я не видел подобной лямбда-нотации раньше.Это действительно так в вашем коде, или что-то теряется, когда вы набираете это в StackO?

Я бы ожидал чего-то более похожего на:

 m => m[i].forTextbox

или, может быть, даже:

 m => m.Books[i].forTextBox

, но, не зная, от чего унаследовано ваше мнение, я немного растерялся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...