模型绑定因 Kendo MultiSelect 而失败

Model binding fails with Kendo MultiSelect

在模型中,我有 long? 字段,我喜欢为它使用 Kendo MultiSelect。做出这个选择的主要原因是server-side filtering。它不反映当前模型的值,也不向服务器发送任何值。通过检查流量,我确定它不会更新模型的值。

@(Html.Kendo().MultiSelectFor(x => x.theField)
    .Name("msname")
    .MaxSelectedItems(1)
    .Placeholder("")
    .HighlightFirst(true)
    .DataValueField("Id")
    .DataTextField("Text")
    .AutoBind(true)
    .DataSource(ds =>
        ds.Read(" ", "API").ServerFiltering(true))
    .Value(new long?[] { Model.theField})
)

我可以放置一个隐藏字段并更新它的值或者multiselect的改变,但应该有更好的解决方案。

我应该注意到这个 multi select 在一个编辑器模板中,并被弹出编辑器中的 Kendo Grid 使用。

更新

使用nullable类型时,需要使用ValuePrimitive(true)!所以结束码是:

@(Html.Kendo().MultiSelectFor(x => x.theField)
    .MaxSelectedItems(1)
    .Placeholder("")
    .HighlightFirst(true)
    .DataValueField("Id")
    .DataTextField("Text")
    .AutoBind(true)
    .DataSource(ds =>
        ds.Read(" ", "API").ServerFiltering(true))
    .ValuePrimitive(true)
)

The main reason for this choice is server-side filtering

您可以在他们的演示站点上找到 DropDownListComboBox 也支持该功能。但是如果你坚持使用 MultiSelect 那么让我们挖掘你的一些代码。

Look Name() 方法将为您的输入元素命名,例如 (input, select)。当表单序列化时,它将使用我们的输入名称作为表单字段 属性。如果您使用的 HtmlHelper 以 "For" 结尾,例如 (LabelFor, MultiSelectFor) 输入属性名称将由其绑定的 属性.[=31= 命名]

Html.Kendo().MultiSelectFor(x => x.theField)

你将拥有

<select name="theField"> ....

您不必再使用 Name() 方法,因此 MultiSelect 值将按照序列化到服务器的形式绑定为 theField 属性。

现在,如果您在控制器内部调试时查看 Request.Form["theField"],您将看到发送的是什么值。如果选择了多个项目,它通常是连接字符串数组的内容,因此您需要更改 theField 类型以处理 array of stringint nullable long 类型。

编辑

您终于找到了解决问题的方法,这个解决方案归功于 Akbari

When using nullable types, you need to use .ValuePrimitive(true)