2009-04-28 5 views
3

rouleau avec moi et imaginez l'exemple suivant:Modélisation plus complexe (réelle)?

Public ViewResult GiveMeFruit(int personId, string personName, int personAge, int fruitId){ 
    Person person = PersonService.GetPerson(personId); 
    person.Name = personName; 
    person.Age = age; 
    person.Fruits.Add(FruitService.GetFruit(fruitId)); 
    ViewData.Person = person; 
    View(ViewData); 
} 

Cela devrait être fait mieux comme si

Public ViewResult GiveMeFruit(Person person, IFruit fruit){ 
    person.Fruits.Add(fruit); 
    ViewData.Person = person; 
    View(ViewData); 
} 

J'ai essayé modelbinding plus tôt, mais bon je ne pouvais pas le faire fonctionner correctement. Tous les exemples vous montrent comment cela fonctionne avec un type extrêmement simple, jamais avec plusieurs types complexes. Comment le modelbinder pourrait-il savoir quel champ est pour quel type? Et s'il y a un fruit1 et un fruit2? Comment le classeur sait-il quel type de béton utiliser pour mon interface IFruit? En outre je me demande comment cela fonctionnerait si je veux donner un fruit IEnumerable à ma personne.

+0

N'allons pas à camelot c'est un endroit idiot. C'est seulement un modèle .. –

Répondre

3

je crois qu'il devrait se présenter comme suit:

<input type="text" name="person.Name" value="" /> 
<input type="text" name="person.Age" value="" /> 
<input type="text" name="fruit.Property1" value="" /> 
<input type="text" name="fruit.Property2" value="" /> 

Pour les collections:

<input type="text" name="fruit[0].Property1" value="" /> 
<input type="text" name="fruit[0].Property2" value="" /> 
<input type="text" name="fruit[1].Property1" value="" /> 
<input type="text" name="fruit[1].Property2" value="" /> 

Comme dans this question.

+0

Que diriez-vous d'un IList ? –

+0

S'il vous plaît voir ma modification. –

+0

Les paramètres shouldn n'ont pas de préfixe Bind dans ce cas? Ou c'est juste une autre convention que j'ai manquée? –