加载Kendo MVC Grid时已添加具有相同键的项

时间:2014-11-30 19:41:19

标签: asp.net-mvc razor kendo-grid kendo-asp.net-mvc

我正在尝试填充一个Kendo mvcGrid并且我一直收到错误已经添加了一个具有相同键的项目。

我在其他地方看到重复的模型属性是问题的最可能的来源,但我的模型中没有重复的属性。我甚至简化了所有内容,只是为了消除尽可能多的可能变量。我无法让网格加载数据。

我已经尝试过它作为Html.Partial,它最初没有加载因为一个空模型然后通过jquery加载它...我尝试过传入我的空模型,以便网格最初加载数据,然后做数据源刷新......也没有运气。基本上,只要我尝试使用填充模型向网格添加内容,我就会收到错误并且没有加载任何数据。

现在已经解决了这个问题2天并没有运气。我可能会在这里发布我的代码,也许其他人可以看到我错过了什么。

一个无法更改的变量是网格位于部分视图上,模型与其父视图不同。

在父视图中我已尝试过两次

<div id ="columnkgrid">@{Html.RenderPartial("Columns", new TestFieldIssue.Models.FieldListModel());}</div>

<div id="columnkgrid">@Html.Partial("Columns", new TestFieldIssue.Models.FieldListModel())</div>

无论哪种方式都可以成功发布没有数据的网格。它还没有数据,因为它是通过选择下拉列表中的值来填充的。

为了不使示例过于复杂,我只是在我用来刷新网格的jquery函数中设置了一个硬编码值。

function loadgrid() {
    var grid = $("#grid").data("kendoGrid");
    var val = 1;
    grid.dataSource.read({ table_pk: val });
    grid.refresh();    
}

部分中的网格代码再一次保持简单,没有任何铃声和口哨只是为了测试。

 @(Html.Kendo().Grid(Model.fields)
                        .DataSource(data => data
                            .Ajax()
                            .Model(model => model.Id(m => m.field_pk))
                            .Read(r => r.Action("Columns","Home"))
                            )

                        .Name("grid")
                        .Columns(c =>
                            {                              
                                c.Bound(m => m.field_name).Title("Field Name").Width(100);
                            })
    )

和控制器方法加载一些模拟数据

public ActionResult Columns(int? table_pk)
        {
            FieldListModel model;
            if (table_pk == null)
            {
                model = GetEmptyColumns();
            }
            else
            {
                model = GetColumns();
            }
            return PartialView("Columns", model);
        }
        public FieldListModel GetColumns()
        {
            FieldListModel model = new FieldListModel();
            model.fields = new List<FieldModel>();
            model.fields.Add(new FieldModel { field_name = "field1", field_pk = 1 });
            model.fields.Add(new FieldModel { field_name = "field2", field_pk = 2 });
            model.fields.Add(new FieldModel { field_name = "field3", field_pk = 3 });
            return model;
        }
        public FieldListModel GetEmptyColumns()
        {
            FieldListModel model = new FieldListModel();
            model.fields = new List<FieldModel>();
            model.fields.Add(new FieldModel { field_name = "", field_pk = 0 });
            return model;
        }

和一个非常简单的模型

public class FieldListModel
    {
        public List<FieldModel> fields { get; set; }
    }
 public class FieldModel
    {
        public int field_pk { get; set; }
        public string field_name { get; set; }
    }

1 个答案:

答案 0 :(得分:1)

我做了一些更改来运行你的代码(正确版本的Kendo和JQuery)。可能是与我的机器设置有关的那些。我能够重现这个问题。

然后我更改了操作代码,并且能够看到Grid中填充的值:

public ActionResult Columns(int? table_pk, [DataSourceRequest] DataSourceRequest request)
{
    FieldListModel model;

    if (table_pk == null)
    {
        model = GetEmptyColumns();
    }
    else
    {
        model = GetColumns();
    }
    return Json(model.fields.ToDataSourceResult(request));
}

此更改正在接受DataSourceRequest类型的操作方法中的其他参数。 Kendo网格在此对象中包装请求以指定排序和分页信息。网格本身使用DataSourceRequest对象下的数据进行更新(注意在return语句中)。更多信息here