使用Kendo MultiSelect进行模型绑定失败

时间:2015-07-12 07:56:37

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

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

@(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})
)

我可以设置隐藏字段并更新其值或多选更改,但应该有更好的解决方案。

我应该注意,这个多选是在编辑器模板中,并由弹出编辑器中的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)
)

1 个答案:

答案 0 :(得分:2)

  

此选择的主要原因是server-side filtering

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

Look Name()方法会为您的输入元素指定名称,例如inputselect)。在表单序列化时,它将使用我们的输入名称作为表单的字段属性。如果您使用以&#34结尾的HtmlHelper;对于"例如(LabelForMultiSelectFor)输入属性名称将由其绑定属性命名。

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

你将

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

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

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

修改

最后你找到了解决问题的方法,这个解决方案归功于Akbari

  

使用可空类型时,需要使用.ValuePrimitive(true)