2010-07-11 7 views
0

J'ai quelque chose comme çaPourquoi cela fonctionne-t-il?

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

Je trouve étrange que les œuvres DropDownList mais la zone de texte ne fonctionne pas. Pour rendre le travail textbox je dois faire

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

Cela est logique d'être parce que avant que je passais à la vue une liste vide de livres, mais juste si étrange que cela fonctionne pour l'un et pas l'autre . Je pense que les deux échoueraient.

+0

Dans votre contrôleur, faites-vous 'return View()' ou 'return View (viewModel)' – Robaticus

Répondre

2

Je devine que le DropDownListFor ne fait rien à l'article au rendu de page, il attend jusqu'à ce que la page soit postée (par exemple, il ne l'évalue pas, donc pas d'exception d'exception de l'index). TextBoxFor essaie d'obtenir la valeur et la place sur la page, il doit donc évaluer m=>ViewModel.Books[i].forTextBox au rendu de page.

Editer: Ok, j'ai lu les choses de Phil un peu plus près. Son approche est assez complexe, et sans voir votre point de vue dans (la plus grande partie) de sa totalité, il devient plus difficile de comprendre où vous avez divergé.

En fin de compte, cependant, je suppose que ma réponse est toujours valable.

Je suis un peu confus au sujet de cette notation, cependant:

m => ViewModel.Books[i].forTextBox 

Je ne l'ai pas vu la notation lambda comme ça avant. Est-ce que cela ressemble vraiment à votre code, ou est-ce que quelque chose s'est perdu quand vous l'avez tapé dans StackO?

Je me serais attendu à quelque chose qui ressemble plus le long des lignes de:

m => m[i].forTextbox 

ou, peut-être même:

m => m.Books[i].forTextBox 

mais sans savoir ce que vous pensez est héritant de la, je suis à un peu de perte.

+0

Hmm, il semble que cela fonctionne pour ce type. http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx – chobo2

+0

En effet, il dispose d'un post de formulaire codé en dur pour ajouter des enregistrements à sa collection. Est-ce que vous faites cela aussi? – Robaticus

+0

désolé, que voulez-vous dire poste de formulaire codé en dur. Je devine que je ne le fais pas exactement de la même manière que lui ou le mien aurait probablement travaillé. – chobo2

Questions connexes