使用来自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");
答案 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;
最后的更改在编辑器模板中,以更改与组织视图模型匹配的DataTextField
和DataValueField
属性:
@(Html.Kendo().DropDownList()
.Name("ParentOrganization")
.DataTextField("ParentOrganizationName")
.DataValueField("ParentOrganizationId")
.AutoBind(true)
.ValuePrimitive(true)
.BindTo((IEnumerable) ViewData["OrganizationSelectList"])
)