html 助手 DropDownListFor() 的 List<SelectListItem>()

List<SelectListItem>() for html helper DropDownListFor()

我正在尝试生成如下列表-

@using SkyTracker.Models
@model SkyTracker.Models.Outlet
@{
    var outletTypeList = new List<SelectListItem>();
    foreach (var item in ViewBag.OutletTypes)
    {
        //Exception Cannot implicitly convert type 'int' to 'string'
        var newType = new SelectListItem { Text = item.OutletTypeName, Value = item.OutletTypeId };
        outletTypeList.Add(newType);
    }
}



<form method="post" action="@(ViewBag.BaseUrl)OutletManagement/Create?id=@ViewBag.RaId">
    @Html.LabelFor(m => m.OutletTypeId, new { @class="required"})
    @Html.DropDownListFor(m => m.OutletTypeId, outletTypeList, new {required="required" })

</form>

但是我在 foreach 循环中遇到异常。有帮助吗?

SelectListItemValue属性是tyeofstring所以如果OutletTypeId是typeofint,那么使用Value = item.OutletTypeId.ToString().

然而,该代码属于控制器,而不是视图,理想情况下,您应该使用包含 属性 IEnumerable<SelectListItem> OutletTypeList

的视图模型
public class OutletVM
{
    [Required(ErrorMessage = "Please select an outlet type")]
    public int? OutletTypeId { get; set; } // nullable to protect against under-posting attacks
    public IEnumerable<SelectListItem> OutletTypeList { get; set; }
    ....
}

并在控制器中

OutletVM model = new OutletVM()
{
    OutletTypeList = yourCollection.Select(x => new SelectListItem
    {
        Value = x.OutletTypeId.ToString(),
        Text = x.OutletTypeName
    },
    .... // set other properties of the view model
};
return View(model);

并在视图中

@Html.DropDownListFor(m => m.OutletTypeId, Model.OutletTypeList, "Please select")
@Html.ValidationMessageFor(m => m.OutletTypeId)

另请注意,您应该删除 new {required="required" },它仅是 HTML5 客户端验证,并将 RequiredAttribute 添加到 属性 您的绑定,以便您同时获得客户端和服务器端验证。

也考虑使用

 @using (Html.BeginForm("Create", "OutletManagement", new { id = @ViewBag.RaId }))

生成表单元素