如果没有更改任何内容,我的KendoUI MultiSelect仅返回第一个选定的值。
当我加载Viewpage时,MultiSelect会正确填充数据和多个选择。当我现在继续保存数据而没有改变任何东西(!)时,转移到我的控制器的模型(大多数时候,没有模式可辨别)仅包含适当字段中的第一个选定项目。如果我添加新选择,则只返回先前选择的第一个项目以及新选择的项目。
如果我使用.AutoBind(false)然后单击一次进入该字段然后再次外部而没有取消选择任何内容,则传输到我的控制器的模型包含保存的全部内容。
在同一个ViewPage上有多个MultiSelects(在不同的数据上),在一个MultiSelect上使用.AutoBind(false)就足够了(后面的点击如上),这样所有MultiSelects都会突然返回所有选定值的范围
任何人都可以向我解释这种奇怪的行为,甚至可能解决这个问题吗?
View中的两个不同的实现,它们都显示相同的行为(GetDepotList()返回与ViewData [“DepotList”]类似的内容):
@model List<LoadingUnitViewModel>
[...]
//Version 1
@(Html.Kendo().MultiSelectFor(m => m[i].FK_Depots)
.Name("[" + i.ToString() + "]." + "FK_Depots")
.Placeholder(Localize((string)ViewData["ControllerName"], "ChooseDepot"))
.DataValueField("Value")
.Value(Model[i].FK_Depots)
.DataTextField("Text")
.DataSource(source =>
{
source.Read(read =>
{
read.Action("GetDepotList", (string)ViewData["ControllerName"]);
})
.ServerFiltering(true);
})
.HtmlAttributes(new { id = "_" + i + "__FK_Depots"})
)
//Version 2
@(Html.Kendo().MultiSelectFor(m => m[i].FK_Depots)
.Name("["+i.ToString()+"]."+"FK_Depots")
.Placeholder(Localize((string)ViewData["ControllerName"], "ChooseDepot"))
.BindTo(new MultiSelectList((System.Collections.IEnumerable)ViewData["DepotList"], "Id", "Name", Model[i].FK_Depots))
)
编辑: 根据要求:LoadingUnitViewModel的相关部分:
public class LoadingUnitViewModel
{
[Editable(false)]
[Display(Name = "Id")]
public int Id { get; set; }
[Required]
[Display(Name = "Name")]
public string Name { get; set; }
[Display(Name = "FK_Depots")]
public List<string> FK_Depots { get; set; }
}
答案 0 :(得分:3)
我们遇到了一些奇怪的问题与Kendo MultiSelect并没有绑定到MVC模型,我会告诉你我们做了什么。问题的一部分看起来就是你给多选的名字。我不知道为什么你需要像你一样生成多个名字。如果您为其指定一个名称属性,则可以获取所有值。这就是我的多选择的样子。请注意,名称只是“广告商”
@(Html.Kendo().MultiSelect()
.Name("Advertisers")
.BindTo(Model.Advertisers)
.HtmlAttributes(new { style="width:445px;" })
.DataTextField("Text")
.Filter("startswith")
.MinLength(5)
.MaxSelectedItems(3)
.DataValueField("Value")
.AutoBind(false)
.Placeholder("Type the first five characters of the advertiser name...")
.Value(Model.Advertisers)
.HtmlAttributes(new {style = "width:415px;"})
.Events(e => e.Select("advertiserSelected"))
.DataSource(source =>
{
source.Read(read =>
{
read.Action("GetAccounts", "CrmIntegration");
})
.ServerFiltering(true);
})
)
在控制器内的表单提交中,值不会转到模型,所以我们就这样拉它们。
string[] advertisers = Request.Form["Advertisers"].ToString().Split(',');
foreach (var s in advertisers)
{
// access to the values in multiselect
}
修改强>
应该注意的是,无论您是否使用default model binder
,.Name("Property")
都会将值绑定到MultiSelectFor
中指定的属性。在发布此答案后我意识到了这一点。
@(Html.Kendo().MultiSelectFor(x => x.AdvId)
.Name("Advertisers")
//will bind to Advertisers, not AdvId on post