Domanda

Ho una classe personalizzata:

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");
    }
}

Passo questa classe per mio punto di vista fortemente tipizzato:

<%@ 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>

E quando passo in rassegna alla pagina, io alla fine con il messaggio di errore: I modelli possono essere utilizzati solo con il campo e proprietà accessor espressioni. Dopo un po 'di googling, ho capito che questo accade perché le funzioni EditorFor e LabelFor possono accettare solo le proprietà immediati dell'oggetto Modello, e FavoriteFoods [0] non è una proprietà immediato. Qualcuno ha un lavoro in giro che renderebbe il codice lavoro senza utilizzare una stringa per specificare il nome del controllo? È anche possibile? In modo ottimale Vorrei usare un'espressione dal modello alla voce che ha bisogno di un editor, che determina da solo il nome del controllo per l'ingresso.

Provare alcune cose, sono stato in grado di ottenere questo lavoro utilizzando le seguenti modifiche alla vista:

<% 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" />
<% } %>

E 'importante notare, tuttavia, che parte destra della espressione in EditorFor e LabelFor deve essere il nome esatto della lista che si sta tentando di popolare e l'elenco deve essere di un tipo di base (cioè String, Int32, ecc). Quando cerco di usare tipi complessi tuttavia, non riesce ancora. Ho cercato di visualizzare un elenco di questa classe persona con ingressi per ogni proprietà e visualizza tutti loro al browser bene, ma poi restituisce una lista nulla alla mia azione posta. Come faccio ad avere l'indice di presentarsi in nome di ingressi per gli elementi di una lista?

Questo è stato un aiuto enorme nel capire cosa stava succedendo.

È stato utile?

Soluzione

Presumo che ciò è per la lista FavoriteFoods. Come è stato fatto in ASP.NET MVC v1 stava avendo qualcosa di simile:

<input type="hidden" name="FavouriteFoods.Index" value="0" />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top