【问题标题】:Kendo UI DropDownListFor value cannot be null binding errorKendo UI DropDownListFor 值不能为空绑定错误
【发布时间】:2013-05-10 14:33:53
【问题描述】:

我的 MVC 4 应用程序中有以下 Kendo UI DropDownListFor,并且在提交时出现 value cannot be null 错误。

@Html.Kendo()
.DropDownListFor(m => m.JobTitle)
.BindTo(ViewData["Jobs"] as SelectList)

通常我会使用视图模型来处理绑定,但在这种情况下,这不是一个选项,因此我尝试使用 ViewData 列表填充我的列表。该列表可以很好地加载到下拉列表中,但它没有将我的选择与 JobTitle 值相关联。任何关于这方面的建议都将不胜感激,因为我已经尝试了我能想到的一切。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-4 kendo-ui kendo-asp.net-mvc


    【解决方案1】:

    当我省略指定 Name 属性时,我也遇到了同样的问题。

    【讨论】:

      【解决方案2】:

      您是否为包装器指定了 DataTextField() 和 DataValueField() 属性?

      例如

               @Html.Kendo().DropDownListFor(m => m.JobTitle)
                                                      .OptionLabel("Select Job Title...")
                                                      .DataTextField("text")
                                                      .DataValueField("value")
      .BindTo(ViewData["Jobs"] as SelectList)
      

      更新:

          List<SelectListItem> JobTitles = new List<SelectListItem>();
          JobTitles.Add(new SelectListItem { Value="One", Text = "One"});
          JobTitles.Add(new SelectListItem { Value="Two", Text = "Two"});  
          JobTitles.Add(new SelectListItem { Value="Three", Text = "Three"});
          JobTitles.Add(new SelectListItem { Value = "Four", Text = "Four" });
          SelectList jobs = new SelectList(JobTitles, "value","text");
          ViewData["Jobs"] = jobs;
      

      更新 2:

       @Html.HiddenFor(m => m.JobTitle)
       @(Html.Kendo().DropDownList().Name("JobTitlesList").OptionLabel("Select Job Title...").Events(e => {
                      e.Change("listChange");
                  }).BindTo(new SelectList((IEnumerable<string>)ViewData["Jobs"])))
      
      
      //JScript event handler
      
      function listChange(e) 
        {
           //console.log(e);
           $('#JobTitle').val(e.sender.text());
        }
      

      【讨论】:

      • 如果我想对选项进行硬编码,但它不会将我的列表与值相关联,这将起作用。该列表来自数据库,因此我不想将这些值输入代码本身。
      • 为了澄清,DataValueField 接受一个字符串,我的值在一个列表中,所以我不确定在这种情况下如何使它工作。
      • 好的,澄清一下,所以服务器正在返回一个 SelectList 并且没有办法让它简单地返回一个 IEnumerable 来代替?
      • BindTo() 需要一个 IEnumerable ,所以它适用于绑定......下拉列表显示了它应该的值,一切看起来都很棒。正如您在最初的答案中提到的那样,问题在于它以不同的方式看待文本和数据值。它将我的项目识别为文本而不是值,我不知道在这种情况下如何设置它。
      • 我将通过初始化一个选择列表来更新我的答案,您能否确认您在 ViewData["Jobs"] 中传递的对象是否相似?
      【解决方案3】:

      我遇到了同样的问题,但我必须使用 as IEnumerable 而不是 SelectList 才能使其正常工作。

                      @(Html.Kendo().DropDownList()
                          .Name("ControlName")
                          .DataValueField("value")
                          .DataTextField("text")
                          .BindTo(ViewData["UnitList"] as IEnumerable)
      

      在控制器中,ViewData 是这样填充的:

      ViewData["prodUnits"] = 
      DbHelper.GetUnitList("Stuff");
      

      而 DbHelper 看起来像这样:

          public virtual IEnumerable<Object> GetUnitList(string thing)
          {
              using (var Db = new dbEntities())
              {
                  return (from obj in Db.Units
                          where obj.things == thing
                          select new
                          {
                              value = obj.Unit_ID,
                              text = obj.Unit_Name
                          }).ToList().Distinct().OrderBy(obj => obj.value);
              }
      
      
          }
      

      老实说,我不明白这一点,错误给了我绝对没有任何线索,如果 IEnumerable 已通过 ViewData 保留,它看起来像是类型..

      【讨论】:

      • 我尝试了大多数关于如何做到这一点的不同建议,这就是有效的。
      【解决方案4】:

      你可以试试这个:代码

      @(Html.Kendo().DropDownListFor(m => m)
       .DataTextField("Text")
                    .DataValueField("Value")
                    .BindTo(new List<SelectListItem>() {
                    new SelectListItem() {
                        Text = "Select",
                        Value = null
                    },
                    new SelectListItem() {
                        Text = "Yes",
                        Value = true.ToString()
                    },
                    new SelectListItem() {
                        Text = "No",
                        Value = false.ToString()
                    }
                })
      .HtmlAttributes(new { data_value_primitive = "true" }))
      

      任何建议:vishalroxx7@gmail.com

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多