DropDownList не заполняется с правильным значением в ASP.NET MVC - PullRequest
5 голосов
/ 22 февраля 2011

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

Вот урезанная версия представления, которая работает правильно:

@model AppName.Models.Guest

@using (Html.BeginForm())
{
    Attending Ceremony?<br />
    @Html.DropDownListFor(x => x.ConfirmCeremony, new SelectList(new Dictionary<string, string>
    {
        {"No Answer", "No Answer"},
        {"Yes", "Yes"},
        {"No", "No"},
        {"Maybe", "Maybe"}
    }, "key", "value"))
    @Html.ValidationMessageFor(x => x.ConfirmCeremony)
    <br />
    Attending Reception?<br />
    @Html.DropDownListFor(x => x.ConfirmReception, new SelectList(new Dictionary<string, string>
    {
        {"No Answer", "No Answer"},
        {"Yes", "Yes"},
        {"No", "No"},
        {"Maybe", "Maybe"}
    }, "key", "value"))
    @Html.ValidationMessageFor(x => x.ConfirmReception)
}

Модель этого вида имеет пользовательский тип Guest, и когда он отображает раскрывающиеся списки Церемония посещения и Прием присутствия, он правильно выбирает параметр, сохраненный в модели. Поэтому, если я вернусь, чтобы отредактировать этого гостя, я смогу увидеть все, что выбрал в последний раз, когда редактировал его, как и ожидалось. Это представление доступно только для администратора и имеет больше параметров, чем следующее.

Вот урезанная версия представления, которая не работает:

@model AppName.Models.Invite @*Invite has navigation property .Guests which is a collection of custom type Guest*@

@using (Html.BeginForm("SaveRSVP", "Wedding"))
{
    @Html.HiddenFor(x => x.Id)
    <table cellpadding="15px" cellspacing="0">
        <tr>
            <th>
                Name
            </th>
            @if (Model.Guests.Any(x => x.InvitedToCeremony))
            {
                <th>
                    Attending Ceremony?
                </th>
            }
            <th>
                Attending Reception?
            </th>
        </tr>
        @Html.EditorFor(x => x.Guests)
    </table>
    <br />
    <input type="submit" value="Save Responses" />
}

Html.EditorFor(x => x.Guests) загружает шаблон редактора, который содержит раскрывающиеся списки для церемонии посещения и приема на прием. Вот шаблон редактора:

@model AlexAndNikki.Models.Guest

<tr>
    <td>
        @Html.HiddenFor(x => x.GuestID)
        @Model.FullName()
    </td>
    @if (Model.Invite.Guests.Any(x => x.InvitedToCeremony))
    {
        <td>
            @if (Model.InvitedToCeremony)
            {
                <text>
                @Html.DropDownListFor(x => x.ConfirmCeremony, new SelectList(new Dictionary<string, string>
                        {
                            {"No Answer", "No Answer"},
                            {"Yes", "Yes"},
                            {"No", "No"},
                            {"Maybe", "Maybe"}
                        }, "key", "value"))
                @Html.ValidationMessageFor(x => x.ConfirmCeremony)
                </text>
            }
            else
            {
                <text>
                    No more invites.
                </text>
            }
        </td>
    }
    <td>
        @Html.DropDownListFor(x => x.ConfirmReception, new SelectList(new Dictionary<string, string>
            {
                {"No Answer", "No Answer"},
                {"Yes", "Yes"},
                {"No", "No"},
                {"Maybe", "Maybe"}
            }, "key", "value"))
        @Html.ValidationMessageFor(x => x.ConfirmReception)
    </td>
</tr>

При этом отображаются выпадающие списки, и если я выбираю элементы и выполняю POST, значения правильно отправляются на сервер. Однако выпадающие списки не выбирают правильное значение. Я даже отобразил значение, сохраненное в модели для редактора, в виде простого текста над выпадающим списком, чтобы убедиться, что правильные значения попадают в редактор, и это так. Это проблема с выпадающими списками. Я подозреваю, что это как-то связано с тем, что этот редактор повторяется для каждого Guest, прикрепленного к Invite, но я не могу точно определить проблему.

ПРИМЕЧАНИЕ : то же самое происходит, если я не использую редактор, а вместо этого делаю что-то подобное в представлении:

@for (int i = 0; i < Model.Guests.Count; i++)
{
                        @Html.DropDownListFor(x => x.Guests.ToList()[i].ConfirmCeremony, new SelectList(new Dictionary<string, string>
                        {
                            {"No Answer", "No Answer"},
                            {"Yes", "Yes"},
                            {"No", "No"},
                            {"Maybe", "Maybe"}
                        }, "key", "value"))
}

Та же проблема существует здесь, выпадающий список не выберет значение в поле. Он просто остается с индексом 0.

Любая помощь приветствуется.

1 Ответ

4 голосов
/ 22 февраля 2011

Существует еще одна перегрузка в конструкторе списка выбора, который принимает выбранное значение в качестве четвертого параметра.

Попытка:

    @Html.DropDownListFor(x => x.ConfirmReception, new SelectList(new Dictionary<string, string>
        {
            {"No Answer", "No Answer"},
            {"Yes", "Yes"},
            {"No", "No"},
            {"Maybe", "Maybe"}
        }, "key", "value", Model.ConfirmReception))

Редактировать: упс, попробуйте, если ConfirmReception является свойством объекта Guest.

Edit: у меня была похожая проблема с этим, не привязывая значение к ddl. Я просто напишу что-то похожее на то, что я сделал.

Editorpage:

@model Models.OptionViewModel

@using (Html.BeginForm())
{ 
    @Html.EditorFor(r => r.OptionID, new { SelectList = Model.Options })

    @Html.SubmitButton()
}

ViewModel

public class OptionViewModel
{
    [DisplayName("Option")]
    [Required]
    [DataType("DropDownList")]
    public int OptionID { get; set; }

    public SelectList Options { get; private set; }

    public OptionViewModel()
    {
        Options = new SelectList(new OptionRepository().GetAll(), "ID", "Name");
    }

    public OptionViewModel(IOption option)
    {
        this.OptionID = option.OptionID;
        Options = new SelectList(new OptionRepository().GetAll(), "ID", "Name", OptionID);
    }
}

EditorTemplate: DropDownList.cshtml

@model int

<div class="editor-label">
    @Html.LabelFor(m => m)
</div>
<div class="editor-field">
    @Html.DropDownListFor(m => m, ViewBag.SelectList as SelectList, "Select an item...")
    @Html.ValidationMessageFor(m => m)
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...