Привязка модели к списку в asp.net mvc 2. Найденный пример. Не могу найти, где я иду не так - PullRequest
0 голосов
/ 23 июня 2010

Я основал свою работу на статье Фила Хаака: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

Я также просмотрел несколько постов здесь на StackOverflow и не могу получить от них ответ на мою проблему.Тем не менее, они, вероятно, представляют решение.Я предполагаю, что мне нужно разбить биты немного больше.

Я пытаюсь заставить привязку модели работать для представления, Модель которого является сложным типом, где одно из свойств является списком другого сложного типа.Вот мои объекты:

        public class Data
        {
            public Data()
            {
                Assessments = new List<AssessmentItem>();
            }

            public String Associate { get; set; }
            public String Department { get; set; }
            public String JobTitle { get; set; }
            public int StartPeriod { get; set; }
            public int EndPeriod { get; set; }
            public List<AssessmentItem> Assessments { get; set; }

        }

        public class AssessmentItem
        {
            public long Index { get; set; }
            public String Heading { get; set; }
            public String Comments { get; set; }
        }   

Я пытался использовать шаблонное решение EditorFor +, представленное в статье Хаака.Вот мое представление Index (обратите внимание, что оно строго типизировано для одного объекта, а не для List).

Вот метод контроллера, который принимает сообщение (хотя, я не думаю, что это будет иметь значение дляначальная генерация представления):

    [HttpPost]
    public ActionResult Index(Data data)
    {
        return View(data);
    }

Как видите, на этом этапе он не работает.Это просто отображает данные, которые были опубликованы.

Вот шаблон редактора в папке Shared / EditorTemplates.

    (file name: AssessmentItem.ascx location: 
                Views/Shared/EditorTemplates)           
    <%@ Control Language="C#"
    Inherits="System.Web.Mvc.ViewUserControl<Project.Models.AssessmentItem>" %>
    <%@ Import Namespace="Project.Models" %>

    Assessment Item Heading: <%= Model.Heading %>
    <%= Html.HiddenFor(model => Model.Heading) %>
    <%= Html.HiddenFor(model => Model.Index) %>
    <%= Html.TextBoxFor(model => model.Comments) %>
    <%= Html.ValidationMessageFor(model => model.Comments) %>

Моя путаница заключается в том, что я не уверен, как указать индекс для каждого элемента AssessmentItem.Статья и код Haack включают несколько методов расширений HtmlHelper, которые я также включил в свой собственный код, но это не решило проблему.

Вот код вызова моего представления (раньше он использовал Html.RenderPartial в цикле, но я не мог понять, как привязать его обратно к части модели Model.Assessments в модели):

         <% for (int i = 0; i < Model.Assessments.Count; i++) { %>
            Entering Loop
            <% Html.EditorFor(m => m.Assessments[i] ); %>
        <% } %>

Признаюсь, у меня здесь довольно большой пробел в знаниях.Я только что разбил поверхность с ASP.NET MVC 1, прежде чем пытаться ASP.NET MVC 2, хотя улучшения кажутся оправданными.

Одна вещь, которая очень странная, это то, что я не могу использоватьсинтаксис <%:%>.В любое время я получаю несколько ошибок во время компиляции.Я могу использовать типичные <%%> & <% =%>, хотя.Я застрял здесь, поэтому любые комментарии будут оценены.Код не выдает никаких ошибок.Страница загружается так, как будто ничего не было брошено.Это просто элементы управления, которые должны быть сгенерированы с помощью оператора Html.EditorFor.Текст «Цикл ввода» печатается дважды, поэтому я знаю, что в моем списке есть объекты AssessmentItem.

Спасибо за любую помощь.

1 Ответ

1 голос
/ 24 июня 2010

Нет необходимости в for петлях. Все, что вам нужно, это:

<%= Html.EditorFor(m => m.Assessments) %>

Это автоматически вызовет ваш AssessmentItem.ascx шаблон редактора для каждого элемента в коллекции Assessments вашей модели. Так что просто убедитесь, что контроллер инициализирует это значение. Он автоматически позаботится о создании правильных имен для входов в шаблоне редактора, чтобы работала привязка модели.

<%: ... %> является только ASP.NET 4.0 и эквивалентен <%= Html.Encode(...) %>, но если вы используете .NET 3.5, он не будет вам доступен. Также обратите внимание на отсутствие ; в конце EditorFor помощника при использовании с <%= ... %>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...