C# 设置Html.DropDownList()的默认值
当它发回时,我得到以下错误: 具有键“ClosingDateDay”的ViewData项的类型为“System.Int32”,但必须为“IEnumerable”类型。有什么想法吗 这是我的控制器: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,
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)