Razor 从剑道网格中的其他列到达dataitem
我假设在执行网格时,从另一列获取当前项是很简单的 试着看看这个例子。硬编码的106应该是部门ID,但我不能使用p lambda,我不知道如何使用Razor 否则我想我必须用JavaScript来做Razor 从剑道网格中的其他列到达dataitem,razor,kendo-grid,kendo-asp.net-mvc,Razor,Kendo Grid,Kendo Asp.net Mvc,我假设在执行网格时,从另一列获取当前项是很简单的 试着看看这个例子。硬编码的106应该是部门ID,但我不能使用p lambda,我不知道如何使用Razor 否则我想我必须用JavaScript来做 @(Html.Kendo().Grid<Product>() .Name("grid") .DataSource(dataSource => dataSource .Ajax() .Model(model => m
@(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())
这相当复杂,但这将是我建议的实施。它还假设您在控制器层中将部门id或父id作为某种路由参数,您将在控制器操作代码片段中看到这一点 首先,为承载剑道网格的页面创建视图模型。它可能看起来像这样:
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>();
}
}
现在,将剑道网格更改为:
@(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())
这里唯一的变化是不执行IEnumerableWdata[Editorials]。其中x=>x.ParentId==106您可以执行Model.Editorials,因为控制器会过滤掉您的结果。这是我使用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>
您的视图是否有ViewModel?如果是这样,我可以给你一个替代的解决方案。我可以得到任何需要的。有一段时间我有一个视图模型,或者下拉列表可以通过ajax/odata获取。我试图钩住编辑事件,因为下拉列表只在编辑期间出现,但也无法在那里找到它。如果我在初始控制器中这样做,那么我会将其减少一次。其想法是,它必须根据行进行更改,例如,一个部门中的一个产品比另一个部门有另一套社论。我不想每行有不同的下拉列表。啊,对不起,我误解了。我认为实现这一点的唯一方法是通过JS,但我不确定是否有一个现成的实现。
<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>
.Events(e => e.Edit("onEdit"))