这就是我填充dropdownlist并创建html元素的方法;
的AccountController:
public ActionResult Index()
{
ViewBag.Towns = new SelectList(_skrsService.GetTowns(), "Value", "Text", 1);
return View();
}
...
public List<SelectListItem> GetTowns()
{
var list = UnitOfWork.Repository<SkrsIl>().OrderBy(x => x.Adi).Select(x => new SelectListItem()
{
Text = x.Adi,
Value = x.Kodu.ToString()
}).ToList();
return list;
}
Login.cshtml(Hometown是绑定到登录视图页面的模型中的字符串字段):
@Html.DropDownListFor( x => x.Hometown, ((SelectList)ViewBag.Towns), new { @class = "form-control", placeholder = "Doğum Yeri" })
我预计这会有效,但会收到错误消息:
“具有键'Hometown'的ViewData项是类型的 'System.String'但必须是'IEnumerable&lt; SelectListItem&gt;'类型。“
如何让它正常工作?我只是期望选择项目值为'Hometown'属性
答案 0 :(得分:1)
错误表示ViewBag.Towns
为null
。当第二个参数(IEnumerable<SelectListItem> selectList
)为null
时,该方法需要第一个参数为IEnumerable<SelectListItem>
的类型。
由于您已在GET方法中分配了它,因此当您提交表单并返回视图但未像在GET方法中那样重新填充ViewBag.Towns
的值时,几乎肯定会发生这种情况。
作为旁注,使用new SelectList()
是无意义的额外开销 - 它只是根据第一个创建另一个IEnumerable<SelectListItem>
。此外,绑定到模型属性时,将忽略SelectList
构造函数的第4个参数 - 在此内部,该方法构建新的IEnumerable<SelectListItem>
并根据值Selected
设置public ActionResult Index()
{
ViewBag.Towns = _skrsService.GetTowns();
return View(); // ideally you should be returning a model
}
[HttpPost]
public ActionResult Index(YourModel model)
{
if (!ModelState.IsValid)
{
ViewBag.Towns = _skrsService.GetTowns(); // re-populate the SelectList
return View(model);
}
// save and redirect
}
属性。属性你绑定。
您的控制器代码应为
ViewBag
但最好是你应该使用包含选择列表属性的视图模型而不是messy <- data.frame(o1 = c(1,2,1,2),
o2 = c(2,3,0,1),
o3 = c(3,2,0,1),
o4 = c(1,1,4,4))
normalized.messy = messy/apply(messy,1,sum)
。