KendoUI MVC MultiSelect - 在某些情况下只有一个返回值

时间:2014-02-05 10:55:58

标签: asp.net-mvc-4 kendo-ui kendo-asp.net-mvc

如果没有更改任何内容,我的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; }

}

1 个答案:

答案 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