通过ViewBag将SelectList传递给DropDownListFor

时间:2018-10-11 18:21:45

标签: asp.net-mvc

尝试使用状态初始化SelectList并显示下拉列表时出现以下错误:

  

值不能为null。参数名称:项目

相关控制器代码:

            var states = new List<SelectListItem>
            {
                new SelectListItem() { Value = "MO", Text = "Missouri" },
                new SelectListItem() { Value = "KS", Text = "Kansas" },
                new SelectListItem() { Value = "AR", Text = "Arkansas" }
            };
            ViewBag.StateList = states;
            return RedirectToAction("Register2", "Account");

查看代码:

@Html.DropDownListFor(model => model.State, new SelectList(ViewBag.StateList, "Value", "Text"), new { @class = "form-control" })

1 个答案:

答案 0 :(得分:3)

存储在ViewBag中的数据仅可用于一个HTTP请求,因此通常用于将数据从Action传递到其View。

使用RedirectToAction时,ViewBag.StateList中的数据会丢失。

您可以:
•在states动作中创建Register2对象。

•如果无法移动states对象,则可以使用TempData代替ViewBag,并且数据将在重定向后保留下来。

var states = new List<SelectListItem> {
    new SelectListItem() { Value = "MO", Text = "Missouri" },
    new SelectListItem() { Value = "KS", Text = "Kansas" },
    new SelectListItem() { Value = "AR", Text = "Arkansas" }
};

TempData["StateList"] = states;

但是您必须将其强制转换为视图中的列表:

@{ 
    var states = (IEnumerable<SelectListItem>)TempData["StateList"];
}
@Html.DropDownListFor(model => model.State, new SelectList(states, "Value", "Text"), new { @class = "form-control" })

•更好的选择是不要依赖ViewBag / ViewData,而应将其替换为Action中调用View的Model类上的属性:

public List<SelectListItem> States{ get; set; }

视图调整为:

@Html.DropDownListFor(model => model.State, Model.States, new { @class = "form-control" })