Как связать несколько выпадающих списков на странице редактирования ASP.NET MVC? - PullRequest
2 голосов
/ 01 марта 2010

У меня есть модель представления, которая содержит ряд свойств, список SelectList и массив дочерних объектов.

public class RoundViewModel
{
    public int RoundId { get; set; }
    public string RoundName { get; set; }
    public SelectList Teams { get; private set; }
    public List<GameViewModel> Games { get; set; }
}

public class GameViewModel
{
    public int HomeTeamId { get; set; }
    public int AwayTeamId { get; set; }
    public DateTime GameTimeGMT { get; set; }
}

Может быть разное количество игр за раунд, и я пытаюсь привязать один и тот же Teams SelectList к каждому выпадающему списку, который я помещаю на страницу:

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <%= Html.HiddenFor(model => model.CodeId) %>
        <div class="editor-label">
            <%= Html.LabelFor(model => model.RoundNumber) %>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.RoundNumber) %>
            <%= Html.ValidationMessageFor(model => model.RoundNumber) %>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.RoundName) %>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.RoundName) %>
            <%= Html.ValidationMessageFor(model => model.RoundName) %>
        </div>

        <%     
        for (int i = 0; i < Model.Games.Count; i++)
        {
        %>
        <div class="editor-label">
            Game:
        </div>
        <div class="editor-field">
        <%= Html.DropDownList("Games[" + i + "].HomeTeamId", Model.Teams, "--No Game--", new { value = Model.Games[i].HomeTeamId })%> VS 
        <%= Html.DropDownList("Games[" + i + "].AwayTeamId", Model.Teams, "--No Game--", new { value = Model.Games[i].AwayTeamId })%>

            <%= Html.TextBox("Games[" + i + "].GameTimeGMT", Model.Games[i].GameTimeGMT, new { Class = "calendar", value = Model.Games[i].GameTimeGMT })%>
        </div>
        <% } %>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

<% } %>

Аналогичное представление прекрасно работает для операции Create, но я не могу установить существующий выбор в каждом из раскрывающихся списков. Вы можете видеть, что я явно устанавливаю дату и время для каждой игры.

Строка new { value = Model.Games[i].HomeTeamId } устанавливает атрибут для элемента <select> html, но, очевидно, это не сработает. Я думал об установке другого атрибута и использовании jQuery для установки выбранного элемента, но он кажется еще более хакерским, чем существующий код.

Я довольно новичок в MVC, поэтому могу определенно оценить, правильно ли я поступаю. Кто-нибудь может помочь?

1 Ответ

2 голосов
/ 01 марта 2010

Если вы посмотрите на конструктор объекта SelectList, то увидите, что он принимает список объектов IEnumerable в качестве источника и другие параметры для установки полей данных и текста, а также выбранного элемента.

Есть ли какая-то особая причина, по которой ваша модель View хранит список выбора, а не список команд? Тогда вы сможете сделать

Html.DropDownList("Games[" + i + "].HomeTeamId", 
    new SelectList(Model.Teams, Model.Games[i].HomeTeamId));

public class RoundViewModel
{
    ....
    public IList<TeamObject> Teams { get; private set; }
...