Я изучаю MVC, используя версию v2 с Entity Framework v4. Допустим, у меня есть 3 объекта Game, Points и Players. Они связаны следующим образом:
В игре есть очки, и с очками может быть связан игрок (1 игра на множество очков, а у одного объекта может быть один игрок).
Я пытаюсь использовать функцию EditTemplates в MVC2 для визуализации моих представлений. В моем представлении «Редактирование игры» я хочу, чтобы редактировалась основная информация об объекте игры, а также связанные объекты «Точки». В настоящее время я использую «<%= Html.EditorForModel() %>
» (что кажется довольно медленным) для рендеринга представления «Правка», а затем у меня есть конкретные шаблоны редактирования игры и точки.
Данные отображаются правильно и доступны для редактирования как для игры, так и для информации о точках. Когда я иду, чтобы выполнить обновление и отправить форму, я получаю объект «Игра» в моем обновлении ActionResult. Основные свойства заполняются для объекта Game, но любые глубокие свойства, такие как «Точки», отсутствуют; они появляются как ноль. Если я посмотрю на переменные Request.Form в отладке, то увижу, что поля Points передаются на сервер, но не помещаются обратно в объект Game.
В моей игре EditTemplate я использую следующее для рендеринга объектов Points:
<%= Html.EditorFor(c => c.Points) %>
Мои очки EditTemplate выглядит так:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Domain.Model.Entities.Point>" %>
<%= Html.EditorFor(c => c.PntId)%>
<tr><td><%= Html.DisplayFor(c => c.User.Username)%></td><td><%= Html.EditorFor(c => c.UserPnt)%></td></tr>
Мой HTML-код выглядит следующим образом:
<input id="Points_Points_0__PntId" name="Points.Points[0].PntId" type="hidden" value="226" />
<tr><td>Jay</td><td><input class="text-box single-line" id="Points_Points_0__UserPnts" name="Points.Points[0].UserPnts" type="text" value="20" /></td></tr>
<input id="Points_Points_1__PntId" name="Points.Points[1].PntId" type="hidden" value="227" />
<tr><td>Joe</td><td><input class="text-box single-line" id="Points_Points_1__UserPnts" name="Points.Points[1].UserPnts" type="text" value="20" /></td></tr>
Как я могу заставить глубокие Свойства публиковать обратно в объекте Game, который принят обновлением Контроллера ActionResult, чтобы я мог обновлять их одновременно?
UPDATE:
Это определенно кажется проблемой с тем, как EditTemplate рендерит коллекцию Points. Если я вручную добавлю следующее к представлению, оно правильно отобразится в объекте Game:
<input class="text-box single-line" id="Game_Points_0__UserPnts" name="Game.Points[0].UserPnts" type="text" value="20" />
<input class="text-box single-line" id="Game_Points_1__UserPnts" name="Game.Points[1].UserPnts" type="text" value="20" />
Есть идеи, почему это отображается как "Points.Points [index] вместо Game.Points [index]? Я пытался связываться с параметрами в EditFor:
<%= Html.EditorFor(c => c.Points,null,"Game.Points") %>
но затем входные данные отображаются как Game.Points.Game.Points [index]