模型绑定因 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
您可以在他们的演示站点上找到 DropDownList
和 ComboBox
也支持该功能。但是如果你坚持使用 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 string
或 int
nullable long
类型。
编辑
您终于找到了解决问题的方法,这个解决方案归功于 Akbari
When using nullable types, you need to use .ValuePrimitive(true)
在模型中,我有 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
您可以在他们的演示站点上找到 DropDownList
和 ComboBox
也支持该功能。但是如果你坚持使用 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 string
或 int
nullable long
类型。
编辑
您终于找到了解决问题的方法,这个解决方案归功于 Akbari
When using nullable types, you need to use .ValuePrimitive(true)