Pergunta

Eu tenho uma classe 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");
    }
}

eu passar essa classe para meu ponto de vista fortemente tipificada:

<%@ 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 eu navegar para a página, eu acabar com a mensagem de erro: Os modelos podem ser usados ??somente com o campo e propriedade acessor expressões. Após um pouco de googling, eu descobri que isso acontece porque as funções EditorFor e labelFor só pode aceitar propriedades imediato do objeto Model, e FavoriteFoods [0] não é uma propriedade imediata. Alguém tem um trabalho em torno o que tornaria o código de trabalho sem usar uma corda para especificar o nome do controle? É mesmo possível? Otimamente eu gostaria de usar uma expressão do modelo para o item que precisa de um editor, que determina por si próprio o nome do controle para a entrada.

Tentando mais algumas coisas, eu era capaz de começar este trabalho usando as seguintes alterações à 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" />
<% } %>

É importante notar, contudo, que o lado direito da expressão em EditorFor e labelFor deve ser o nome exato da lista que você está tentando preencher ea lista deve ser de um tipo básico (ou seja, String, Int32, etc). Quando tento usar tipos complexos no entanto, ainda não. Tentei apresentar uma lista desta classe pessoa com entradas para cada propriedade e exibe todos eles para o navegador muito bem, mas, em seguida, ele retorna uma lista nulo para minha ação post. Como faço para obter o índice para mostrar-se em nome de entradas para os itens de uma lista?

Esta foi uma ajuda enorme em descobrir o que estava acontecendo.

Foi útil?

Solução

Eu assumo isto é para a lista FavoriteFoods. Como tem sido feito em ASP.NET MVC v1 estava tendo algo como isto:

<input type="hidden" name="FavouriteFoods.Index" value="0" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top