Вопрос

У меня есть собственный класс:

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

Я передаю этот класс своему строго типизированному представлению:

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

И когда я перехожу на страницу, я получаю сообщение об ошибке:Шаблоны можно использовать только с выражениями доступа к полям и свойствам.Немного погуглив, я понял, что это происходит потому, что функции EditorFor и LabelFor могут принимать только непосредственные свойства объекта Model, а FavoriteFoods[0] не является непосредственным свойством.Есть ли у кого-нибудь обходной путь, который позволил бы коду работать без использования строки для указания имени элемента управления?Возможно ли это вообще?Оптимально хотелось бы использовать выражение из модели для элемента, которому нужен редактор, который самостоятельно определяет имя элемента управления для ввода.

Попробовав еще кое-что, мне удалось заставить это работать, используя следующие изменения в представлении:

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

Однако важно отметить, что правая часть выражения в EditorFor и LabelFor должна быть точным именем списка, который вы пытаетесь заполнить, и этот список должен быть базового типа (т.String, Int32 и т. д.).Однако когда я пытаюсь использовать сложные типы, это все равно терпит неудачу.Я попытался отобразить список этого класса людей с входными данными для каждого свойства, и он отлично отображает их все в браузере, но затем возвращает нулевой список в мое действие публикации.Как мне заставить индекс отображаться в имени входных данных для элементов списка?

Это была огромная помощь в выяснении того, что происходит.

Это было полезно?

Решение

Я предполагаю, что это для списка FavoriteFoods.Как это было сделано в ASP.NET MVC v1, было что-то вроде этого:

<input type="hidden" name="FavouriteFoods.Index" value="0" />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top