【问题标题】:how to bind selectlistitem value in dropdownlist to string property in model如何将下拉列表中的选择列表项值绑定到模型中的字符串属性
【发布时间】:2017-07-21 12:40:00
【问题描述】:

这就是我填充下拉列表和创建 html 元素的方式;

帐户控制器:

      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(家乡是模型中绑定到登录视图页面的字符串字段):

 @Html.DropDownListFor( x => x.Hometown, ((SelectList)ViewBag.Towns), new {  @class = "form-control", placeholder = "Doğum Yeri" })

我希望这可以工作,但收到错误消息:

"具有键 'Hometown' 的 ViewData 项的类型为 'System.String' 但必须是 'IEnumerable' 类型。"

我怎样才能让它正常工作?我只是期望选择项值为“家乡”属性

【问题讨论】:

  • 表示viewBag.Towns的值为null——参考this answer。附带说明一下,使用 new SelectList() 是毫无意义的额外开销 - 您创建一个相同的 IEnumerable&lt;SelectListItem&gt; 并且构造函数的第 4 个参数被忽略 - 它的 Hometown 的值决定了选择的内容
  • 您好,您的评论包含的内容超出了我的需要,如果您将此作为答案发布,我很乐意接受,谢谢!

标签: asp.net-mvc html-helper


【解决方案1】:

错误意味着ViewBag.Townsnull。当第二个参数(IEnumerable&lt;SelectListItem&gt; selectList)为null时,该方法期望第一个参数为typeof IEnumerable&lt;SelectListItem&gt;

由于您已在 GET 方法中分配它,当您提交表单并返回视图但没有像在 GET 方法中那样重新填充 ViewBag.Towns 的值时,几乎肯定会发生这种情况。

附带说明,使用new SelectList() 是毫无意义的额外开销——它只是基于第一个IEnumerable&lt;SelectListItem&gt; 创建另一个IEnumerable&lt;SelectListItem&gt;。此外,当您绑定到模型属性时,SelectList 构造函数的第 4 个参数将被忽略 - 该方法在内部构建一个新的 IEnumerable&lt;SelectListItem&gt; 并根据您绑定到的属性的值设置 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多