如何设置Kendo文本框的值并将该值传递给控制器​​以使模型有效?

时间:2017-08-07 14:11:23

标签: javascript jquery kendo-ui telerik kendo-asp.net-mvc

我在Javascript中设置了一个Kendo文本框For的值,屏幕上显示了该值,但是当它到达控制器时,得到该字段为空且模型状态无效的错误。如何设置文本框的值并保留该值以使模型状态有效?

这就是我所拥有的:

  • 使用C#的ASP.net MVC Visual Studio项目
  • Kendo / Telerik Scheduler Control
  • 模板中定义的调度程序的事件弹出(单独的CSHTML文件)
  • 在模板中,字段标题
  • 的Kendo TextBoxForControl
  • 同样在模板中,字段TaskSourceWoId
  • 的Kendo下拉列表

当用户从下拉列表中选择一个值时,Javascript会设置标题的值,如下所示:

$("#Title").val("WO# " + workOrderID);

屏幕上显示文字(参见下面的屏幕截图)。但是,当用户单击“保存”按钮时,会出现“标题不能为空”的错误。如果我在控制器中查看用户单击save时遇到的方法,我可以看到模型中Title确实为null,这导致模型状态无效。我添加了Javascript以在使用上面的代码设置它之后立即获取Title的值,它是null。

我尝试了几种在javascript中设置Title的方法;大多数情况下都是这样的:

alert($("#Title").data("kendoTextBox").value());

并返回“未找到”错误。

那么如何设置标题不仅会出现在屏幕上,还会被控制器识别而不会使模型状态无效?

这是首次打开时的事件弹出窗口。注意此时标题是空白的: enter image description here

从下拉列表中选择工单后,标题设置为包含此值,标题现在在屏幕上显示值:

$(“#Title”)。val(“WO#”+ workOrderID); enter image description here

但是,当用户单击save并且代码转到控制器时,Model State无效且Title的值为null:

enter image description here

enter image description here

这是调度程序的代码:

@(Html.Kendo().Scheduler<SchedTasksModel>()
                      .Name("scheduler")
                      .Date(DateTime.Today)
                      .StartTime(DateTime.Parse(string.Format("{0} {1}", DateTime.Today.ToShortDateString(), "07:00")))
                      .Height(600)
                      .Views(views =>
                      {
                          views.DayView();
                          views.WeekView(weekView => weekView.Selected(true));
                          views.MonthView();
                          views.AgendaView();
                      })
                      .Editable(editable => editable.TemplateName("KoorsenEditor"))
                      .Timezone("Etc/UTC")
                      .Events(e => { e.Edit("sched_edit"); })
                      .Resources(resource =>
                      {
                          resource.Add(m => m.TaskType)
                              .Title("Type")
                              .DataTextField("Text")
                              .DataValueField("Value")
                              .DataColorField("Color")
                              .BindTo(new[]
                              {
                                  new {Text = "Work Order", Value = 1, Color = "#6eb3fa"},
                                  new {Text = "Event", Value = 2, Color = "#f58a8a"}
                              });

                          resource.Add(m => m.TaskSourceId)
                              .Title("Wo")
                              .DataTextField("Name")
                              .DataValueField("Id")
                              .DataSource(ds => ds.Read(read => read.Action("GetSchedWo", "Sched", new { userID = ViewBag.CurrUser, userType = ViewBag.CurrUsrType })));

                          resource.Add(m => m.TaskSourceEvtId)
                              .Title("Evt")
                              .DataTextField("Name")
                              .DataValueField("Id")
                              .BindTo(new[]
                              {
                                  new {Name = "Meeting", Id = 1},
                                  new {Name = "Vacation", Id = 2},
                                  new {Name = "Sick Time", Id = 3},
                                  new {Name = "Other", Id = 4}
                              });
                          resource.Add(m => m.TaskResId)
                              .Title("Res")
                              .DataTextField("Name")
                              .DataValueField("Id")
                              .DataSource(ds => ds.Read(read => read.Action("GetTechRes", "Sched")));
                      })
                      .DataSource(d => d.Model(m =>
                      {
                          m.Id(f => f.TaskId);
                          m.Field(f => f.Title).DefaultValue("");
                          m.Field(f => f.TaskType).DefaultValue(1);
                          m.RecurrenceId(f => f.RecurrenceId);
                      })
                          .Events(e =>
                          {
                              e.Error("error_handler");
                              e.Sync("onSchedulerSync");
                          })
                          .Create("WrkOrdTasksCreate", "Sched")
                          .Read("WrkOrdTasksRead", "Sched")
                          .Update("WrkOrdTasksUpdate", "Sched")
                          .Destroy("WrkOrdTasksDestroy", "Sched")
                          .Filter(filters => filters.Add(model => model.TaskResId).IsNotEqualTo(0))
                      )
                      )

定义文本框的Editor.cshtml

 @(Html.TextBoxFor(model => model.Title, new {@class = "k-textbox", data_bind = "value:title"}))

Javascript设置标题字段的值

    function onWorkOrderChange(e) {
    try {
        var workOrderID = $("#TaskSourceWoId").data("kendoDropDownList").value();
        if ($("#Title").val() == "") {
            $("#Title").val("WO# " + workOrderID);
        }
    } catch (ex) {
        alert(ex);
    }
}

1 个答案:

答案 0 :(得分:3)

听到Telerik回来。他们的回答是:

  

为了通知模型自动分配的标题值,您必须触发标题字段的更改事件

对于文本框,我刚刚将更改()添加到作业的末尾:

$("#Title").val("WO# " + workOrderID).change();

这对下拉列表没有用处。我终于在另一个StackOverflow页面上找到了它的语法:here

所以在我的情况下,适用于下拉列表的代码是:

$("#TaskResId").data("kendoDropDownList").value('@ViewBag.CurrUser');
$("#TaskResId").data("kendoDropDownList").trigger("change");