EditTemplates и связанные объекты с MVC2 - PullRequest
2 голосов
/ 06 января 2010

Я изучаю 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]

Ответы [ 2 ]

1 голос
/ 19 января 2010

Это явно ошибка в ранних выпусках MVC. Согласно комментарию, который я получил от Microsoft на форуме MVC, он выглядит исправленным в RTM-версии.

Я вернулся к использованию цикла for для генерации HTML за это время.

Вот ответ форума MVC для справки: http://forums.asp.net/t/1515461.aspx

0 голосов
/ 06 января 2010

Они должны называться Game.Points [0] .PntId или вы можете добавить очки в качестве аргумента к вашему действию и объединить их в действии. Особенно, если вы сохраняете их в БД, вам, вероятно, придется их прикрепить.

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