2015-07-12 116 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