2015-07-12 117 views
1

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

@(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的变化,但应该有一个更好的解决方案。

我应该注意到,这个多重选择是在一个编辑器模板中,由弹出编辑器中的Kendo Grid使用。

UPDATE

当使用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

主要的原因选择server-side filtering

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

Look Name()方法会为您的输入元素指定一个名称,例如(input,select)。当表单序列化时,它将使用我们的输入名称作为表单的字段属性。如果您使用以“For”结尾的HtmlHelper,例如(LabelForMultiSelectFor),则输入属性名称将通过其绑定属性命名。

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

您将有

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

您不必再使用Name()方法,因此多选值将被绑定为theField财产按序列化到服务器的形式。

现在,如果您在控制器内部进行调试时查看Request.Form["theField"],您将看到要发送的值。它通常加入字符串数组的内容,如果选择了多个项目,所以你需要改变theField类型来处理的stringint阵列,而不是nullable long类型。

编辑

最后你发现你的解决问题的办法,这种解决方案信用阿克巴丽

当使用可空类型,你需要使用.ValuePrimitive(真)

+0

我无法理解你的问题,你可以做一个小样本项目,重现你目前的情况?也许它会启发我找到解决方案.. –

+0

感谢您的努力Dion,问题是,如果模型的字段'theField'目前是'null',我无法改变它,这两个控件都不会更新它的值。但如果它已经有一些价值,我可以改变它,两个控件都会更新它。不幸的是,我无法提供样品。 – Akbari

+0

1分钟请迪翁,我想我得到了问题,这可能是因为类型的差异,多选择的数据是不可空的。 – Akbari