我有@Html.DropDownListFor
显示我的数据库中的项目列表。
非常简化我有一个带有这些参数的ViewModel
public class RegisterViewModel
{
[Required]
[Display(Name = "Country")]
public string SelectedCountryId { get; set; }
public IEnumerable<System.Web.Mvc.SelectListItem> CountryList { get; set; }
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
}
然后我在我的控制器中用这个填充IEnumerable<System.Web.Mvc.SelectListItem>
:
IEnumerable<SelectListItem> countries = _DB.Countries.Where(x => x.Status == Status.Visible)
.Select(x => new SelectListItem()
{
Value = x.ID + "",
Text = "(+" +x.PhoneCountryCode + ") - " + x.Name
}).ToList();
countries.First().Selected = true;
然后我使用以下HTML来显示选项集
@Html.DropDownListFor(m => m.SelectedCountryId, Model.CountryList, new { @class = "form-control" })
选项列表始终在页面加载时选择第一个选项,如果单击它,则有三个选项可供选择。
我的问题是,如果你不打开列表并选择一个项目(即只保留默认值),我的视图中会抛出此错误,
具有键“SelectedCountryId”的ViewData项具有类型 'System.String'但必须是'IEnumerable'类型。
如果您打开下拉列表并手动选择项目,则不会发生此错误。如果我从列表SelectedCountryId
中选择其他项目,则会获得正确的值。
我尝试将public string SelectedCountryId { get; set; }
从string
切换为IEnumerable<SelectListItem>
,这确实使错误消失,但列表始终为空。
有什么好主意吗?
答案 0 :(得分:1)
在您的控制器中当模型无效时,重新填充下拉列表:
if (ModelState.IsValid)
{
IEnumerable<SelectListItem> countries = _DB.Countries.Where(x => x.Status == Status.Visible)
.Select(x => new SelectListItem()
{
Value = x.ID + "",
Text = "(+" +x.PhoneCountryCode + ") - " + x.Name
}).ToList();
countries.First().Selected = true;
}
else
{
//We need to rebuild the dropdown or we're in trouble
IEnumerable<SelectListItem> countries = _DB.Countries.Where(x => x.Status == Status.Visible)
.Select(x => new SelectListItem()
{
Value = x.ID + "",
Text = "(+" +x.PhoneCountryCode + ") - " + x.Name
}).ToList();
countries.First().Selected = true;
}
您还可以使用此方法检查模型状态中的错误。 可能会有一些有趣的事情:
var errors = ModelState
.Where(x => x.Value.Errors.Count > 0)
.Select(x => new { x.Key, x.Value.Errors })
.ToArray();