我为它创建了一个类,用于在创建/编辑视图上创建可重用的下拉列表:
public class TimeDropDowns
{
public static int SelectedHour{ get; set; }
public static List<SelectListItem> hours = new List<SelectListItem>()
{
new SelectListItem() {Text="9", Value="09"},
new SelectListItem() {Text="10", Value="10"},
new SelectListItem() {Text="11", Value="11"},
new SelectListItem() {Text="12", Value="12"}
};
}
我能够以2种方式显示下拉列表:
1)在视图@Html.DropDownList("hour", TimeDropDowns.hours, htmlAttributes: new { @class = "form-control" })
2)使用控制器ViewBag.hours = TimeDropDowns.hours;
中的viewbag进行设置
然后在视图@Html.DropDownList("hours", null, htmlAttributes: new { @class = "form-control" })
但我还没有能够使用任何一种方法设置所选值,建议?
答案 0 :(得分:1)
班级SelectListItem
有一个名为Selected
的媒体资源。它的类型是bool。当项目的此属性为true时,则选择它的值。
据说你需要这样的东西:
public class TimeDropDowns
{
public static List<SelectListItem> GetHoursDropDown(int? selectedHour = null)
{
var items = new List<SelectListItem>();
for(var hour=9; hour<=12; hour++)
{
var hourStr = hour.ToString();
var item = new SelectListItem
{
Text = hourStr,
Value = hour < 9 ? "0"+hourStr : hourStr,
Selected = selectedHour.HasValue && selectedHour == 9
}
items.Add(item);
}
return items;
}
}
然后你可以使用如下:
ViewBag.hours = TimeDropDowns.GetHoursDropDown(11);
如果您希望所选小时为第11小时或类似:
ViewBag.hours = TimeDropDowns.GetHoursDropDown();
如果您不想选择任何一个。
当您发布表单时,11的位置将被您发布的值hour
占用。显然,应首先解析此值,然后将其传递给GetHoursDropDown
方法。
我强烈建议你,正如Win在帖子中已正确提到的那样,避免使用ViewBag并创建强类型视图模型。
答案 1 :(得分:1)
您需要将DropDownList设置为 SelectedHour ,而不是 小时 ,以便 ModelBinder 当表单发回服务器时,em>可以将选定的值绑定到 SelectedHour 。
@Html.DropDownList("SelectedHour", ...)
我个人喜欢使用强类型模型。您可以阅读更多here。
答案 2 :(得分:0)
感谢2位响应者的反馈,我决定创建一个强类型模型是最好的方法。由于我的模型是从db生成的,我需要创建一个部分类,以便在db模型刷新时不会丢失更改。我创建了部分类,它是我的模型类的一种
namespace TouchScreenEvents
{
[MetadataType(typeof(TouchScreenEventMetadata))]
public partial class TouchScreenEvent
{
public string selectedHour { get; set; }
public List<SelectListItem> hours = new List<SelectListItem>()
{
new SelectListItem() {Text="9a", Value="09"},
new SelectListItem() {Text="10a", Value="10"},
new SelectListItem() {Text="11a", Value="11"},
new SelectListItem() {Text="12p", Value="12"},
new SelectListItem() {Text="1p", Value="13"},
new SelectListItem() {Text="2p", Value="14"},
new SelectListItem() {Text="3p", Value="15"},
new SelectListItem() {Text="4p", Value="16"},
new SelectListItem() {Text="5p", Value="17"},
new SelectListItem() {Text="6p", Value="18"},
new SelectListItem() {Text="7p", Value="19"},
new SelectListItem() {Text="8p", Value="20"}
};
public string selectedMinute { get; set; }
public List<SelectListItem> minutes = new List<SelectListItem>()
{
new SelectListItem() {Text="00", Value="00"},
new SelectListItem() {Text="30", Value="30"}
};
}
}
要在控制器中设置所选索引,我有这段代码(删除了不必要的部分)
//get edit touchscreen event
TouchScreenEvent touchScreenEvent = await db.TouchScreenEvents.FindAsync(id);
var d = touchScreenEvent.date;
touchScreenEvent.selectedMinute= d.ToString("mm");
touchScreenEvent.selectedHour = d.ToString("HH");
视图代码,具有先前选择的值集。这也可以在没有设置选定索引的情况下工作 - 例如在创建视图中
@Html.DropDownListFor(model => model.selectedHour, Model.hours, htmlAttributes: new { @class = "form-control" })
@Html.DropDownListFor(model => model.selectedMinute, Model.minutes, htmlAttributes: new { @class = "form-control" })
当回发到控制器时,我可以访问像这样的值
touchScreenEvent.selectedHour, touchScreenEvent.selectedMinute