kendo mvc编辑器未绑定到选定的下拉属性

时间:2018-06-27 20:14:16

标签: asp.net-mvc kendo-grid

使用来自kendo网格的内联编辑(v 2017.3.913),用于下拉菜单的编辑器模板没有使用属性ID来设置列表中的选定值(或者这是另一个问题,但相关)。

我从类似的SO问题中尝试了几种解决方案,但是什么也没有产生预期的结果。

剑道网格

//ParentOrganization is the target property
@(Html.Kendo().Grid<OrganizationGridViewModel>()
      .Name("organizationGrid")
      .Columns(columns =>
          {
              columns.Bound(o => o.Id).Width(150).Hidden(true);
              columns.Bound(o => o.Name);
              columns.Bound(o => o.ParentOrganization).ClientTemplate("#= (ParentOrganization.Id == 0) ?  ' ' : ParentOrganization.Name #").EditorTemplateName("ParentOrganization");
              columns.Bound(o => o.OrganizationTypeDescription).Width(165);
              columns.Command(command =>
                    {
                         command.Edit().Text(" ").HtmlAttributes(new { title = "Edit Organization" });
                         command.Destroy().Text(" ").HtmlAttributes(new { title = "Delete Organization" });
                     }).Width(250);
              })
              .ToolBar(toolbar => toolbar.Create().Text("New"))
              .Editable(editable => editable.Mode(GridEditMode.InLine).ConfirmDelete("Are you sure you want to delete this organization?")
              .DisplayDeleteConfirmation("Organization deleted"))
       ...

由于绑定列是导航对象(相对于原始类型),因此我在视图模型中使用[UIHint]指向编辑器模板,以便正确映射对象。

网格中使用的视图模型

public class OrganizationGridViewModel
{
    ...
    // NOTE: the Organization object has "Id" and "Name" properties
    [UIHint("ParentOrganization")]
    public Organization ParentOrganization { get; set; }
}

编辑器模板

@(Html.Kendo().DropDownList()
      .Name("ParentOrganization")
      .DataTextField("Text")
      .DataValueField("Value")
      .BindTo((IEnumerable) ViewData["OrganizationSelectList"])
)

最后,下拉列表使用的数据:

var orgSelectList = organizations.Select(n => new SelectListItem
            {
                Text = n.Name,
                Value = n.Id.ToString()
            }).ToList();

ViewData["OrganizationSelectList"] = new SelectList(orgSelectList, "Value", "Text");

注意

我还尝试使用“ Id”和“ Name”(也将更改传播到编辑器-替换为“ Value”和“ Text”)创建SelectList,以使其与ParentOrganization对象对齐,但是最终产生“未定义”列表项。

orgSelectItems.AddRange(organizations.Select( n => new BaseSelectItem
{
      Id = n.Id,
      Name = n.Name
}));

ViewData["OrganizationSelectList"] = new SelectList(orgSelectList, "Id", "Name");

2 个答案:

答案 0 :(得分:1)

这就是我如何将数据输入Kendo下拉列表中

@(Html.Kendo().DropDownList()
              .Name("showProcessed")
              .DataTextField("OptionText") 
              .DataValueField("ViewOption")
              .AutoBind(true)
              .SelectedIndex(2)
              .Events(e => e.Change("fe_DiaryItem.processedChange"))
              .HtmlAttributes(new { style = "width: 250px;" })
              .DataSource(ds =>
              {
                 ds.Read("DiaryGridViewOptions", "ControllerName");
              })
)

在这种情况下,我用数据源填充对象,然后使用.SelectedIndex(x)选择索引。

如果需要,我还有其他有关如何设置索引的示例,但这正在生产代码中。

----编辑----

@{
    var idxDst = 0;
    if (Model.DiaryTimeSlot != null && Model.DiaryTimeSlotSelectedId > 0)
    {
        idxDst = Model.DiaryTimeSlot.IndexOf(Model.DiaryTimeSlot.First(x => x.DiaryTimeSlotID == Model.DiaryTimeSlotSelectedId));
    }
}

@(Html.Kendo().DropDownList()
              .Name("DiaryTimeSlot")
              .DataTextField("Description")
              .DataValueField("DiaryTimeSlotID")
              .SelectedIndex(idxDst)
              .BindTo(Model.DiaryTimeSlot)
              .DataSource(ds =>
              {
                ds.Read("DiaryTimeSlotOptions", "ControllerName");
              })
) 

答案 1 :(得分:0)

[Kendo或MVC助手本身]似乎不喜欢您使用“适当的” [域]对象-似乎使绑定混乱。我相信根本原因是属性名称相同(ID和名称),并且需要不同。我使用域对象Organization作为属性的类型。我创建了另一个表示组织的视图模型,并使用了不同的属性名称:

代表组织的新视图模型

我不是使用“ Id”和“名称”作为映射的文本和值属性,而是使用以下“ ParentOrganization-x”属性:

public class ParentOrganizationViewModel
{
    public int? ParentOrganizationId { get; set; }
    public string ParentOrganizationName { get; set; }
}

因此,对网格视图模型的更新将反映新的组织视图模型:

public class OrganizationGridViewModel
{
     ...

     [UIHint("ParentOrganization")]
     public ParentOrganizationViewModel ParentOrganization { get; set; }
}

此外,它没有直接返回SelectList作为下拉列表的数据源,而是一个直接的viewlmodel列表:

var orgSelectList = organizations.Select(n => new ParentOrganizationViewModel()
{
    ParentOrganizationName = n.Name,
    ParentOrganizationId = n.Id
}).ToList();

ViewData["OrganizationSelectList"] = orgSelectList;

最后的更改在编辑器模板中,以更改与组织视图模型匹配的DataTextFieldDataValueField属性:

@(Html.Kendo().DropDownList()
     .Name("ParentOrganization")
     .DataTextField("ParentOrganizationName")
     .DataValueField("ParentOrganizationId")
     .AutoBind(true)
     .ValuePrimitive(true)
     .BindTo((IEnumerable) ViewData["OrganizationSelectList"])
)