à l'aide de Html.EditorFor avec un IEnumerable<T>

J'ai une classe personnalisée:

public class Person
{
    public String Name { get; set; }
    public Int32 Age { get; set; }
    public List<String> FavoriteFoods { get; set; }

    public Person()
    {
        this.FavoriteFoods = new List<String>();
        this.FavoriteFoods.Add("Jambalya");
    }
}

Je passe cette classe de ma fortement typé vue:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcLearner.Models.Person>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
 Create
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Create</h2>

    <% using (Html.BeginForm()) { %>
        <%= Html.LabelFor(person => person.Name) %><br />
        <%= Html.EditorFor(person => person.Name) %><br />
        <%= Html.LabelFor(person => person.Age) %><br />
        <%= Html.EditorFor(person => person.Age) %><br />
        <%= Html.LabelFor(person => person.FavoriteFoods[0]) %><br />
        <%= Html.EditorFor(person => person.FavoriteFoods[0]) %>
    <% } %>

</asp:Content>

Et quand j'ai accédez à la page, je me retrouve avec le message d'erreur: Modèles peuvent être utilisés uniquement avec le domaine et la propriété de l'accesseur expressions. Après un peu de recherche sur google, j'ai compris que cela se produit parce que le EditorFor et LabelFor les fonctions ne peuvent accepter immédiate des propriétés de l'objet Modèle, et FavoriteFoods[0] n'est pas une propriété immédiate. Quelqu'un aurait-il une solution qui permettrait de rendre le code du travail sans l'aide d'une chaîne pour spécifier le nom de la commande? Est-il même possible? Idéalement, je voudrais utiliser une expression à partir du modèle de l'élément qui a besoin d'un rédacteur en chef, qui décide de sa propre le nom de la commande pour l'entrée.

Essayer des choses un peu plus, j'ai été en mesure d'obtenir ce travail à l'aide de la suite de modifications apportées à la vue:

<% using (Html.BeginForm()) { %>
    <%= Html.LabelFor(person => person.Name) %><br />
    <%= Html.EditorFor(person => person.Name) %><br />
    <%= Html.LabelFor(person => person.Age) %><br />
    <%= Html.EditorFor(person => person.Age) %><br />
    <% foreach (String FavoriteFoods in Model.FavoriteFoods) { %>
        <%= Html.LabelFor(food => FavoriteFoods) %><br />
        <%= Html.EditorFor(food => FavoriteFoods)%><br />
    <% } %>
    <input type="submit" value="Submit" />
<% } %>

Il est important de noter, toutefois, que la partie droite de l'expression dans EditorFor et LabelFor doit être le nom exact de la liste que vous essayez de remplir et la liste doit être d'un type de base (c'est à dire de la Chaîne, Int32, etc). Lorsque j'essaie d'utiliser des types complexes cependant, il échoue toujours. J'ai essayé d'afficher une liste de cette personne de la classe avec des entrées pour chaque propriété, et il affiche tous pour le navigateur, mais ensuite elle renvoie une valeur null Liste à mon post de l'action. Comment puis-je obtenir l'indice de montrer dans le nom des entrées pour les éléments d'une liste?

C'était un géant de l'aide pour comprendre ce qui se passait.

OriginalL'auteur Nick Larsen | 2009-09-25