从 kendo 网格中的其他列获取数据项
Reach dataitem from other column within a kendo grid
我认为在做网格时从另一列获取当前项目是微不足道的。
试着看看这个例子。硬编码的 106 应该是 DepartmentId,但我不能使用 p lambda,而且我不知道我还应该如何使用 Razor。
否则我想我必须在 JavaScript 中完成。
@(Html.Kendo().Grid<Product>()
.Name("grid")
.DataSource(dataSource => dataSource
.Ajax()
.Model(model => model.Id(c => c.Id))
.Read(read => read.Action("Products_Read", "Product"))
.Update(update => update.Action("Products_Update", "Product"))
)
.Columns(columns =>
{
columns.Bound(p => p.Id).Hidden(true);
columns.Bound(p => p.Title).Title("Titel");
columns.ForeignKey(p => p.DepartmentId, (System.Collections.IEnumerable)ViewData["Departments"], "Id", "Name");
columns.ForeignKey(p => p.EditorialId, ((IEnumerable<Editorial>)ViewData["Editorials"]).Where(x => x.ParentId == 106), "Id", "Name");
columns.Command(command => command.Edit().Text("Rediger").UpdateText("Gem").CancelText("Fortryd"));
})
.Pageable()
.Editable(editable => editable.Mode(GridEditMode.InLine))
.Sortable())
这相当复杂,但这是我推荐的实施方式。它还假设您在控制器层中将 "department id" 或父 ID 作为某种路由参数(您将在控制器操作代码片段中看到它)。
首先,为承载 Kendo 网格的页面创建一个视图模型。它可能看起来像这样:
public class ListViewModel
{
public IEnumerable<Department> Departments { get; set; }
public IEnumerable<Editorial> Editorials { get; set; }
public ListViewModel()
{
Departments = new List<Department>();
Editorials = new List<Editorial>();
}
}
在控制器的使用 Kendo 网格呈现视图的操作方法中,将其更新为类似于此的内容:
(注意:我假设在此示例中使用 Entity Framework,但您可以轻松换出您的数据访问方法。)
public class ActionResult Index(int parentId) // I'm assuming this is a route value of some sort
{
var model = new ListViewModel();
model.Departments = _dbContext.Departments.Where(x => x.ParentId == parentId).ToList();
model.Editorials = _dbContext.Editorials.ToList();
return View(model);
}
现在,将您的 Kendo 网格更改为:
@(Html.Kendo().Grid<Product>()
.Name("grid")
.DataSource(dataSource => dataSource
.Ajax()
.Model(model => model.Id(c => c.Id))
.Read(read => read.Action("Products_Read", "Product"))
.Update(update => update.Action("Products_Update", "Product"))
)
.Columns(columns =>
{
columns.Bound(p => p.Id).Hidden(true);
columns.Bound(p => p.Title).Title("Titel");
columns.ForeignKey(p => p.DepartmentId, Model.Departments, "Id", "Name");
columns.ForeignKey(p => p.EditorialId, Model.Editorials, "Id", "Name");
columns.Command(command => command.Edit().Text("Rediger").UpdateText("Gem").CancelText("Fortryd"));
})
.Pageable()
.Editable(editable => editable.Mode(GridEditMode.InLine))
.Sortable())
这里唯一的变化是,您可以 Model.Editorials
而不是 ((IEnumerable<Editorial>)ViewData["Editorials"]).Where(x => x.ParentId == 106)
,因为控制器会过滤掉您的结果。
这是我的 JavaScript 绑定解决方案。
你必须明白有等级、出版商、部门、社论。
<script>
var departments = $.parseJSON('@Html.Raw(Json.Encode(@ViewData["Departments"]))');
var editorials = $.parseJSON('@Html.Raw(Json.Encode(@ViewData["Editorials"]))');
function onEdit(e) {
//debugger;
$("#DepartmentId").kendoDropDownList({ dataTextField: "Name",dataValueField: "Id",});
$("#EditorialId").kendoDropDownList({ dataTextField: "Name",dataValueField: "Id",});
$('#DepartmentId').data("kendoDropDownList").setDataSource(getDepartments(e.model.PublisherId));
$('#EditorialId').data("kendoDropDownList").setDataSource(getEditorials(e.model.DepartmentId));
}
function getEditorials(parentId) {
return jQuery.grep(editorials, (function (element, index) { return element.ParentId === parentId; }));
}
function getDepartments(parentId) {
return jQuery.grep(departments, (function (element, index) { return element.ParentId === parentId; }));
}
</script>
我不会再post网格,它只需要编辑绑定
.Events(e => e.Edit("onEdit"))
我认为在做网格时从另一列获取当前项目是微不足道的。
试着看看这个例子。硬编码的 106 应该是 DepartmentId,但我不能使用 p lambda,而且我不知道我还应该如何使用 Razor。
否则我想我必须在 JavaScript 中完成。
@(Html.Kendo().Grid<Product>()
.Name("grid")
.DataSource(dataSource => dataSource
.Ajax()
.Model(model => model.Id(c => c.Id))
.Read(read => read.Action("Products_Read", "Product"))
.Update(update => update.Action("Products_Update", "Product"))
)
.Columns(columns =>
{
columns.Bound(p => p.Id).Hidden(true);
columns.Bound(p => p.Title).Title("Titel");
columns.ForeignKey(p => p.DepartmentId, (System.Collections.IEnumerable)ViewData["Departments"], "Id", "Name");
columns.ForeignKey(p => p.EditorialId, ((IEnumerable<Editorial>)ViewData["Editorials"]).Where(x => x.ParentId == 106), "Id", "Name");
columns.Command(command => command.Edit().Text("Rediger").UpdateText("Gem").CancelText("Fortryd"));
})
.Pageable()
.Editable(editable => editable.Mode(GridEditMode.InLine))
.Sortable())
这相当复杂,但这是我推荐的实施方式。它还假设您在控制器层中将 "department id" 或父 ID 作为某种路由参数(您将在控制器操作代码片段中看到它)。
首先,为承载 Kendo 网格的页面创建一个视图模型。它可能看起来像这样:
public class ListViewModel
{
public IEnumerable<Department> Departments { get; set; }
public IEnumerable<Editorial> Editorials { get; set; }
public ListViewModel()
{
Departments = new List<Department>();
Editorials = new List<Editorial>();
}
}
在控制器的使用 Kendo 网格呈现视图的操作方法中,将其更新为类似于此的内容:
(注意:我假设在此示例中使用 Entity Framework,但您可以轻松换出您的数据访问方法。)
public class ActionResult Index(int parentId) // I'm assuming this is a route value of some sort
{
var model = new ListViewModel();
model.Departments = _dbContext.Departments.Where(x => x.ParentId == parentId).ToList();
model.Editorials = _dbContext.Editorials.ToList();
return View(model);
}
现在,将您的 Kendo 网格更改为:
@(Html.Kendo().Grid<Product>()
.Name("grid")
.DataSource(dataSource => dataSource
.Ajax()
.Model(model => model.Id(c => c.Id))
.Read(read => read.Action("Products_Read", "Product"))
.Update(update => update.Action("Products_Update", "Product"))
)
.Columns(columns =>
{
columns.Bound(p => p.Id).Hidden(true);
columns.Bound(p => p.Title).Title("Titel");
columns.ForeignKey(p => p.DepartmentId, Model.Departments, "Id", "Name");
columns.ForeignKey(p => p.EditorialId, Model.Editorials, "Id", "Name");
columns.Command(command => command.Edit().Text("Rediger").UpdateText("Gem").CancelText("Fortryd"));
})
.Pageable()
.Editable(editable => editable.Mode(GridEditMode.InLine))
.Sortable())
这里唯一的变化是,您可以 Model.Editorials
而不是 ((IEnumerable<Editorial>)ViewData["Editorials"]).Where(x => x.ParentId == 106)
,因为控制器会过滤掉您的结果。
这是我的 JavaScript 绑定解决方案。
你必须明白有等级、出版商、部门、社论。
<script>
var departments = $.parseJSON('@Html.Raw(Json.Encode(@ViewData["Departments"]))');
var editorials = $.parseJSON('@Html.Raw(Json.Encode(@ViewData["Editorials"]))');
function onEdit(e) {
//debugger;
$("#DepartmentId").kendoDropDownList({ dataTextField: "Name",dataValueField: "Id",});
$("#EditorialId").kendoDropDownList({ dataTextField: "Name",dataValueField: "Id",});
$('#DepartmentId').data("kendoDropDownList").setDataSource(getDepartments(e.model.PublisherId));
$('#EditorialId').data("kendoDropDownList").setDataSource(getEditorials(e.model.DepartmentId));
}
function getEditorials(parentId) {
return jQuery.grep(editorials, (function (element, index) { return element.ParentId === parentId; }));
}
function getDepartments(parentId) {
return jQuery.grep(departments, (function (element, index) { return element.ParentId === parentId; }));
}
</script>
我不会再post网格,它只需要编辑绑定
.Events(e => e.Edit("onEdit"))