【发布时间】:2011-02-22 00:41:50
【问题描述】:
我在获取下拉列表以在呈现时选择正确的值时遇到问题。它始终默认索引为零。但是,我在另一个地方确实有一个视图,它可以很好地呈现并选择正确的值。我不明白其中的区别。
这是一个可以正常工作的精简版视图:
@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,则值会正确发送到服务器。但是,下拉列表未选择正确的值。我什至在下拉列表上方以纯文本形式为编辑器显示了存储在模型中的值,以验证正确的值是否正在进入编辑器并且它们是正确的。这是下拉列表的问题。我怀疑这与此编辑器重复附加到Invite 的每个Guest 的事实有关,但我无法确定问题所在。
注意:如果我不使用编辑器,而是在视图中执行以下操作,也会发生同样的事情:
@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。
【问题讨论】:
-
模型名称和选择列表名称不能相同,否则浏览器会默认为第一项。请参阅我的 DDL 教程 asp.net/mvc/tutorials/javascript/… 和 blogs.msdn.com/b/rickandy/archive/2012/01/09/…
标签: c# asp.net asp.net-mvc asp.net-mvc-3 razor