C# 设置Html.DropDownList()的默认值

C# 设置Html.DropDownList()的默认值,c#,asp.net-mvc,razor,drop-down-menu,html-helper,C#,Asp.net Mvc,Razor,Drop Down Menu,Html Helper,当它发回时,我得到以下错误: 具有键“ClosingDateDay”的ViewData项的类型为“System.Int32”,但必须为“IEnumerable”类型。有什么想法吗 这是我的控制器: CompetitionEditViewModel viewModel = new CompetitionEditViewModel { ClosingDate = competition.CloseDate, Description = competition.Description,

当它发回时,我得到以下错误:

具有键“ClosingDateDay”的ViewData项的类型为“System.Int32”,但必须为“IEnumerable”类型。有什么想法吗

这是我的控制器:

CompetitionEditViewModel viewModel = new CompetitionEditViewModel
{
    ClosingDate = competition.CloseDate,
    Description = competition.Description,
    DescriptionHeading = competition.DescriptionHeading,
    ImageAssetId = competition.ImageAssetId,
    IsActive = competition.IsActive,
    MainHeading = competition.MainHeading,
    TermsAndConditions = competition.TermsAndConditions,
    UrlSlug = competition.UrlSlug
};

viewModel.ClosingDateMonthOptions = new List<SelectListItem>();
for (int i = 1; i <= 12; i++)
{
    string monthName = new DateTime(2000, i, 1).ToString("MMMM");
    ((List<SelectListItem>)viewModel.ClosingDateMonthOptions).Add(new SelectListItem { Text = monthName, Value = i.ToString() });
}

viewModel.ClosingDateDayOptions = new List<SelectListItem>();
for (int i = 1; i <= 31; i++)
{
    ((List<SelectListItem>)viewModel.ClosingDateDayOptions).Add(new SelectListItem { Text = i.ToString().PadLeft(2, '0'), Value = i.ToString() });
}

viewModel.ClosingDateYearOptions = new List<SelectListItem>();
for (int i = DateTime.Now.Year; i <= DateTime.Now.Year + 3; i++)
{
    ((List<SelectListItem>)viewModel.ClosingDateYearOptions).Add(new SelectListItem { Text = i.ToString(), Value = i.ToString() });
}

在构建SelectListItem类时,将最初要选择的项目的
Selected
属性设置为true。

我在一个项目中做了一些有用的事情,为
DropDownListFor
接受
selectedValue

namespace MyMvcApplication.Helpers
{
    public static class ExtensionMethods
    {
        public static MvcHtmlString DropDownListFor<TModel, TProperty>
                             (this HtmlHelper<TModel> helper,
                              Expression<Func<TModel, TProperty>> expression,
                              string selectedValue,
                              IEnumerable<SelectListItem> selectList,
                              string optionLabel,
                              object htmlAttributes)
        {
            if (string.IsNullOrEmpty(selectedValue))
                selectedValue = string.Empty;
            if (selectList != null)
            {
                foreach (SelectListItem sli in selectList)
                {
                    if (sli.Value.ToLower().Trim() == selectedValue.ToLower().Trim())
                    {
                        sli.Selected = true;
                        break;
                    }
                }
            }
            else 
            { 
                selectList = new List<SelectListItem>() 
                                  { new SelectListItem() 
                                          { Text = "", Value = "", Selected = true }
                                  };
            }
            return helper.DropDownListFor(expression, selectList, optionLabel, htmlAttributes);
        }


        public static MvcHtmlString DropDownListFor<TModel, TProperty>
                             (this HtmlHelper<TModel> helper,
                              Expression<Func<TModel, TProperty>> expression,
                              string selectedValue,
                              IEnumerable<SelectListItem> selectList,
                              string optionLabel,
                              IDictionary<string, object> htmlAttributes)
        {
            if (string.IsNullOrEmpty(selectedValue))
                selectedValue = string.Empty;
            if (selectList != null)
            {
                foreach (SelectListItem sli in selectList)
                {
                    if (sli.Value.ToLower().Trim() == selectedValue.ToLower().Trim())
                    {
                        sli.Selected = true;
                        break;
                    }
                }
            }
            else 
            { 
                selectList = new List<SelectListItem>() 
                                  { new SelectListItem() 
                                          { Text = "", Value = "", Selected = true } 
                                  };
            }
            return helper.DropDownListFor(expression, selectList, optionLabel, htmlAttributes);
        }

    }
}

您的第二个代码段是否缺少
?我假设在您看来,您有
Model.ClosingDate.Day
等作为下拉列表的最后一个参数?@Franky不,不是。但是你确实帮我解决了这个问题,哈哈。谢谢。很乐意帮忙,但想解释一下吗?@Franky好吧,你可以按照你说的方式来做,但我实际上有这三个属性,但正如你所看到的,当我初始化viewModel@Franky确实应该按照你的方式来做,但是我的EditViewModel继承了我的CreateViewModel,它显然需要这些,所以最好使用它们,他提供所选的值作为第三个参数。没有这样的重载来接受下拉列表的“默认值”。正如@tarnbridge所说,
列表
中的一个项目必须具有“.selected=true”。@以隐藏
Html中的第三个重载。DropDownFor()
是设置默认值的另一种方法。这就是@Franky所说的
namespace MyMvcApplication.Helpers
{
    public static class ExtensionMethods
    {
        public static MvcHtmlString DropDownListFor<TModel, TProperty>
                             (this HtmlHelper<TModel> helper,
                              Expression<Func<TModel, TProperty>> expression,
                              string selectedValue,
                              IEnumerable<SelectListItem> selectList,
                              string optionLabel,
                              object htmlAttributes)
        {
            if (string.IsNullOrEmpty(selectedValue))
                selectedValue = string.Empty;
            if (selectList != null)
            {
                foreach (SelectListItem sli in selectList)
                {
                    if (sli.Value.ToLower().Trim() == selectedValue.ToLower().Trim())
                    {
                        sli.Selected = true;
                        break;
                    }
                }
            }
            else 
            { 
                selectList = new List<SelectListItem>() 
                                  { new SelectListItem() 
                                          { Text = "", Value = "", Selected = true }
                                  };
            }
            return helper.DropDownListFor(expression, selectList, optionLabel, htmlAttributes);
        }


        public static MvcHtmlString DropDownListFor<TModel, TProperty>
                             (this HtmlHelper<TModel> helper,
                              Expression<Func<TModel, TProperty>> expression,
                              string selectedValue,
                              IEnumerable<SelectListItem> selectList,
                              string optionLabel,
                              IDictionary<string, object> htmlAttributes)
        {
            if (string.IsNullOrEmpty(selectedValue))
                selectedValue = string.Empty;
            if (selectList != null)
            {
                foreach (SelectListItem sli in selectList)
                {
                    if (sli.Value.ToLower().Trim() == selectedValue.ToLower().Trim())
                    {
                        sli.Selected = true;
                        break;
                    }
                }
            }
            else 
            { 
                selectList = new List<SelectListItem>() 
                                  { new SelectListItem() 
                                          { Text = "", Value = "", Selected = true } 
                                  };
            }
            return helper.DropDownListFor(expression, selectList, optionLabel, htmlAttributes);
        }

    }
}
@using MyMvcApplication.Helpers

@Html.DropDownListFor(model => model.MyData,
                               "Default Value for DropDownList", //Or Model.MySelectedValue
                               Model.MySelectList, null, mull)