Razor 从剑道网格中的其他列到达dataitem

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

我假设在执行网格时,从另一列获取当前项是很简单的

试着看看这个例子。硬编码的106应该是部门ID,但我不能使用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())

这相当复杂,但这将是我建议的实施。它还假设您在控制器层中将部门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"))