剑道 MVC 网格可编辑级联下拉列表显示"未定义"



我正试图跟随Telerik演示级联下拉,但到目前为止我运气不佳。这是我尝试使用的演示:Telerik演示-级联下拉列表
我的问题是,当我根据ModelId筛选联系人时(我有一个不同的名称(,我得到的下拉列表只是说"未定义">

这是我的网格代码(重要的部分(

@(Html.Kendo().Grid<MyViewModel>()
.Name("grid")
.AutoBind(false)
.HtmlAttributes(new { @class = "grid-clickable-edit" })
.Columns(columns =>
{
columns.Command(command =>
{
command.Edit().IconClass("fas fa-pencil").UpdateIconClass("fas fa-check").CancelIconClass("fas fa-ban");
command.Destroy().IconClass("fas fa-trash");
})
.ClientHeaderTemplate(Html.GridAddButton())
.Width(180);
columns.Bound(p => p.ModelId)
.EditorTemplateName("GridDropdownEditor")
.EditorViewData(new { data = ViewBag.ModelList })
.ClientTemplate("#:ModelName#");
columns.Bound(p => p.ContactId)
.EditorTemplateName("ContactCascadingDropdown")
.ClientTemplate("#:ContactName#");
})
.Pageable(pg => pg.Numeric(false).PreviousNext(false))
.Sortable()
.Scrollable(scroll => scroll.Virtual(true))
.Filterable(x => x.Enabled(false))
.Editable(editable => editable.Mode(GridEditMode.InLine))
.DataSource(dataSource => dataSource
.Ajax()
.Batch(true)
.ServerOperation(true)
.Model(model => { model.Id(m => m.MyId); })
.Read(...)
.Create(...)
.Update(...)
.Destroy(...)
))
<script>
function filterContacts() {
return {
modelId: $("#ModelId").val()
};
}
</script>


这是我的ContactCascadingDropdown编辑器模板-

@model object
@(Html.Kendo().DropDownListFor(m => m)
.DataTextField("ContactName")
.DataValueField("ContactId")
.DataSource(source =>
{
source.Read(read =>
{
read.Action("GetCascadingContacts", "ControllerName")
.Data("filterContacts");
})
.ServerFiltering(true);
})
.Enable(false)
.AutoBind(false)
.CascadeFrom("ModelId"))


MyController-
中的GetCascadingContacts方法

public JsonResult GetCascadingContacts(int? modelId)
{
var contacts = _contact.GetListQueryable();
if (contacts != null)
{
contacts = contacts.Where(c => c.ModelId == modelId);
}
return Json(contacts.Select(c => new {ContactName = c.FirstName + " " + c.LastName, c.ContactId}));
}


我相信问题可能出在编辑器模板上,但再说一遍,我真的不知道。

我所尝试的
检查了web浏览器控制台中的错误,没有发现
在Visual Studio中检查了错误输出,没有找到
我还确保modelId值实际上是从我的filterContacts方法传递到我的控制器的,即。还检查了Contacts查询方法是否根据modelId提取实际联系人。

UPDATE
我在下拉列表中得到的行数似乎与我从查询中得到的联系人数量相关。

UPDATE
如果我添加演示调用的JsonRequestBehavior.AllowGet以使我的返回状态为return Json(contacts.Select(c => new {ContactName = c.FirstName + " " + c.LastName, c.ContactId}), JsonRequestBehavior.AllowGet);,那么我会得到错误
Property 'JsonResult.SerializerSettings' must be an instance of type 'Newtonsoft.Json.JsonSerializerSettings'.

当我在我的一个项目中尝试类似的东西时,这种结构对我很有效:

更改:

columns.Bound(p => p.ContactId)
.EditorTemplateName("ContactCascadingDropdown")
.ClientTemplate("#:ContactName#");

至:

columns.ForeignKey(p => p.ContactId, Model.Contacts, "ContactId", "ContactName")
.EditorTemplateName("ContactCascadingDropdown")
.Title("Contact")

上面发生了什么?

  • 我们对模板使用外键
  • 我们定义列的值为p -> p.ContactId
  • 我们使用列表的ID和值传递联系人信息列表(在本例中为ContactIdContactName(

我的编辑器模板看起来像这样:

@model int
@(Html.Kendo().DropDownListFor(m => m)
.AutoBind(true)
.DataTextField("ContactName")
.DataValueField("ContactId")
.DataSource(source =>
{
source.Read(read => read.Action("GetCascadingContacts", "ControllerName")
.Data("filterContacts")).ServerFiltering(true);
})
.CascadeFrom("ModelId")
// If this value could be a nullable you will also need the following
.ValuePrimitive(true)
)

控制器的返回方法应该是:

return Json(contacts.Select(c => new {ContactName = c.FirstName + " " + c.LastName, c.ContactId}), JsonRequestBehavior.Allowget);

问题是Kendo返回的Json不是ContactNameContactId,而是contactNamecontactId。我通过使用浏览器开发工具中的网络选项卡并查看返回的数据来解决这个问题。这是固定和工作版本:

@model object
@(Html.Kendo().DropDownListFor(m => m)
.DataTextField("contactName")
.DataValueField("contactId")
.DataSource(source =>
{
source.Read(read =>
{
read.Action("GetCascadingContacts", "ControllerName")
.Data("filterContacts");
})
.ServerFiltering(true);
})
.Enable(false)
.AutoBind(false)
.CascadeFrom("ModelId"))

最新更新