Question

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 à mon avis fortement typé:

<%@ 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 je passe en revue à la page, je me retrouve avec le message d'erreur: Les modèles peuvent être utilisés uniquement avec le terrain et les expressions accesseur de propriété. Après un peu de googler, je me suis dit que cela se produit parce que les fonctions EditorFor et LabelFor ne peuvent accepter que des propriétés immédiates de l'objet modèle et FavoriteFoods [0] n'est pas une propriété immédiate. Quelqu'un at-il un travail autour de ce qui rendrait le travail de code sans utiliser une chaîne pour spécifier le nom du contrôle? Est-ce que c'est possible? Je voudrais au mieux d'utiliser une expression du modèle à l'élément qui a besoin d'un éditeur, qui détermine lui-même le nom de la commande pour l'entrée.

Essayer quelques autres choses, je suis en mesure d'obtenir ce travail en utilisant les modifications suivantes à 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 cependant que côté droit 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 (à savoir String, Int32, etc). Lorsque je tente d'utiliser des types complexes cependant, il ne fonctionne toujours pas. J'ai essayé d'afficher une liste de cette classe de personnes avec des entrées pour chaque propriété et il affiche tous au navigateur très bien, mais il retourne une liste nulle à mon post action. Comment puis-je obtenir l'index pour apparaître dans le nom des entrées pour les éléments d'une liste?

scroll top