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

boi*_*222 2 javascript jquery telerik kendo-ui kendo-asp.net-mvc

我正在用Javascript设置Kendo文本框For的值,在屏幕上显示该值,但是在到达控制器时出现字段为null且模型状态无效的错误。如何设置文本框的值并保留该值,以便模型状态有效?

这是我所拥有的:

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

当用户从下拉列表中选择一个值时,Javascript会按以下方式设置Title的值:

$("#Title").val("WO# " + workOrderID);
Run Code Online (Sandbox Code Playgroud)

文本显示在屏幕上(请参见下面的屏幕截图)。但是,当用户单击“保存”按钮时,他们会收到错误消息,“标题”不能为空。如果我在控制器中查找当用户单击“保存”时命中的方法,则可以在模型中看到Title确实为空,这导致模型状态无效。我添加了Javascript,以便在使用上面的代码进行设置后立即获得Title的值,并且它为null。

我尝试了几种在javascript中设置Title的方法;基本上是这样的:

alert($("#Title").data("kendoTextBox").value());
Run Code Online (Sandbox Code Playgroud)

并返回“找不到”错误。

那么,如何设置标题不仅显示在屏幕上,还可以被控制器识别并且模型状态无效?

这是事件第一次打开时的弹出窗口。请注意,此时标题为空白: 在此处输入图片说明

从下拉列表中选择工作订单后,标题将设置为包括此值,并且标题现在在屏幕上具有一个值:

$(“#Title”)。val(“ WO#” + workOrderID); 在此处输入图片说明

但是,当用户单击“保存”并将代码转到控制器时,“模型状态”无效,并且“标题”的值为null:

在此处输入图片说明

在此处输入图片说明

这是调度程序的代码:

@(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))
                      ))
Run Code Online (Sandbox Code Playgroud)

Editor.cshtml定义文本框

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

Javascript设置标题字段的值

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

boi*_*222 5

从Telerik听到。他们的回应是:

为了通知模型自动分配的Title值,您将必须触发Title字段的change事件

对于文本框,我只是将change()添加到分配的末尾:

$("#Title").val("WO# " + workOrderID).change();
Run Code Online (Sandbox Code Playgroud)

这对于下拉列表无效。我终于在另一个StackOverflow页面上找到了它的语法:这里

因此,在我的情况下,适用于下拉列表的代码为:

$("#TaskResId").data("kendoDropDownList").value('@ViewBag.CurrUser');
$("#TaskResId").data("kendoDropDownList").trigger("change");
Run Code Online (Sandbox Code Playgroud)