【问题标题】:KendoUI MVC MultiSelect - in some cases only one return valueKendoUI MVC MultiSelect - 在某些情况下只有一个返回值
【发布时间】:2014-02-05 10:55:57
【问题描述】:

如果没有任何更改,我的 KendoUI MultiSelect 仅返回第一个选定的值。

当我加载 Viewpage 时,MultiSelect 会正确填充数据和多项选择。当我现在继续保存数据而不进行任何更改(!)时,传输到我的控制器的模型(大多数情况下,无法识别模式)仅包含相应字段中的第一个选定项目。如果我添加新选择,则只有先前选择的第一个项目与新选择的项目一起返回。

如果我使用 .AutoBind(false) 然后单击一次进入该字段,然后再次单击外部而没有取消/选择任何内容,则传输到我的控制器的模型包含保存时的全部内容。

在同一个 ViewPage 上有多个 MultiSelect(在不同的数据上),在一个 MultiSelect 上使用 .AutoBind(false) 就足够了(随后像上面一样单击),这样所有 MultiSelect 都会突然返回全范围的选定值.

任何人都可以向我解释这种奇怪的行为,甚至可以修复吗?

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; }

}

【问题讨论】:

  • 你的LoadingUnitViewModel是什么样的?
  • 已编辑到原帖中。
  • 您使用 AJAX 绑定是否有原因?我有一个想法,但不需要那样绑定。
  • 我总是对想法持开放态度。这个问题已经花费了我足够多的时间......
  • 我在某处有一些代码。我看看能不能找到。

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


【解决方案1】:

我们在使用 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

【讨论】:

  • 我已经尝试过您的 Request.Form,但它始终与我的模型具有相同的结果。如果模型在列表中有多个条目,则请求也会返回多个条目。如果模型只有一个条目,则请求也只返回一个条目。名称的格式为 [i].name,因为在某些情况下视图可以包含多个模型(这就是 @model List 的原因)。
猜你喜欢
  • 2015-08-03
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2010-12-31
  • 2019-02-16
相关资源
最近更新 更多