asp.net mvc set DropDown Selected Value - 不在模型中

时间:2017-03-10 13:48:25

标签: asp.net asp.net-mvc asp.net-mvc-4

我为它创建了一个类,用于在创建/编辑视图上创建可重用的下拉列表:

  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" })

中引用

但我还没有能够使用任何一种方法设置所选值,建议?

3 个答案:

答案 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 可以将选定的值绑定到 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