Pregunta

Tengo una clase personalizada:

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

Me pasan esta clase de mi establecimiento inflexible de tipos de vista:

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

Y cuando me vaya a la página, termino con el mensaje de error:Las plantillas sólo se pueden utilizar con el campo y la propiedad de los descriptores de las expresiones.Después de un poco de búsqueda en google, me di cuenta de que esto sucede porque el EditorFor y LabelFor funciones sólo puede aceptar inmediata de las propiedades de los objetos del Modelo, y FavoriteFoods[0] no es una propiedad inmediata.¿Alguien tiene un trabajo alrededor de la cual se haría el código de trabajo, sin el uso de una cadena que especifica el nombre del control?Es que incluso posible?De manera óptima, me gustaría usar una expresión de la modelo para el elemento que necesita un editor, que determina en su propio el nombre del control para la entrada.

Probando algunas cosas más, yo era capaz de conseguir este trabajo, utilizando los siguientes cambios a la 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" />
<% } %>

Es importante tener en cuenta sin embargo que el lado derecho de la expresión en EditorFor y LabelFor debe ser el nombre exacto de la lista que se está tratando de llenar y la lista debe ser de un tipo básico (es decir,Cadena, Int32, etc).Cuando trato de usar los tipos complejos sin embargo, todavía no.Traté de mostrar una lista de esta clase de persona con entradas para cada propiedad y se muestra a todos ellos para que el navegador bien, pero, a continuación, devuelve un valor null en la Lista a mi post de la acción.¿Cómo puedo obtener el índice para mostrar en el nombre de las entradas para los elementos de una lista?

Este fue un gigante de la ayuda en averiguar lo que estaba pasando.

¿Fue útil?

Solución

Asumo que esto es para la lista FavoriteFoods. ¿Cómo se ha hecho en ASP.NET MVC v1 fue tener algo como esto:

<input type="hidden" name="FavouriteFoods.Index" value="0" />
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top