如何将dropdownlist中的selectlistitem值绑定到model中的string属性

时间:2017-07-21 12:40:01

标签: asp.net-mvc html-helper

这就是我填充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'属性

1 个答案:

答案 0 :(得分:1)

错误表示ViewBag.Townsnull。当第二个参数(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)