3

在模型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})
)

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

我应该注意到这个多选是在一个编辑器模板中,并且被 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)
)
4

1 回答 1

3

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

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

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

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

你将会有

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

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

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

编辑

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

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

于 2015-07-13T09:36:32.397 回答