我有类似的东西
public class Reminders()
{
public List<SelectListItem> Reminder { get; set; }
public string SelectedReminder { get; set; }
}
现在我想创建一个包含上述内容的Reminder类列表。
List<Reminders> reminders = new List<Reminders>();
// add SelectListItems somehow through auto mapper( not sure how to do)
// add reminders into my viewModel
然后在我看来,我需要循环遍历它们以生成下拉列表。所以我的想法是,如果我想让用户能够设置5个提醒,那么我只需要确保我的收藏有5个提醒。
如果我希望他们只拥有1,我会确保该系列有一个提醒。如果我想要100,那么我将其更改为100.因此,通过这样做,我将来证明该区域可以非常容易地扩展或缩小。
现在在我尝试制作这个并尝试弄清楚如何使用automapper之前我想知道如何让每个下拉列表都有自己的ID?就像现在我可以看到他们都将拥有相同的ID(“SelectedReminder”)。
当然这很糟糕,因为每个html页面只能有一个id。那么我怎样才能让它们有不同的ID?
答案 0 :(得分:2)
如果您使用的是编辑器模板,则不必担心这一点,因为框架将正确处理所有命名约定。您也不需要执行任何循环。因此,假设您有一个返回IEnumerable<Reminders>
的控制器操作,并且您想生成一个下拉列表:
public ActionResult Index()
{
var reminders = new[]
{
new Reminders
{
Reminder = new List<SelectListItem>
{
new SelectListItem { Value = "1", Text = "reminder 1" },
new SelectListItem { Value = "2", Text = "reminder 2" },
},
},
new Reminders
{
Reminder = new List<SelectListItem>
{
new SelectListItem { Value = "1", Text = "reminder 1" },
new SelectListItem { Value = "2", Text = "reminder 2" },
new SelectListItem { Value = "3", Text = "reminder 3" },
},
}
};
return View(reminders);
}
然后在您看来,您只需:
@model IEnumerable<AppName.Models.Reminders>
@using (Html.BeginForm())
{
@Html.EditorForModel()
<input type="submit" value="OK" />
}
和相应的编辑器模板(~/Views/Home/EditorTemplates/Reminders.cshtml
):
@model AppName.Models.Reminders
@Html.DropDownListFor(
x => x.SelectedReminder,
new SelectList(Model.Reminder, "Value", "Text")
)
因为您在视图模型中发送了2个元素,所以会生成2个下拉列表,每个元素都有正确的名称,这样当您回发时,您将获得相应的选定值:
<select name="[0].SelectedReminder">
<option value="1">reminder 1</option>
<option value="2">reminder 2</option>
</select>
<select name="[1].SelectedReminder">
<option value="1">reminder 1</option>
<option value="2">reminder 2</option>
<option value="3">reminder 3</option>
</select>