Kendo.Grid不会在“创建”操作上向控制器发送一些数据

时间:2019-06-12 20:00:20

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

我的Kendo.Grid需要对SAVE CHANGES单击上的数据执行CRUD操作

这是网格的定义:

    @(Html.Kendo().Grid(Model.TicketReportPropertyList)
        .Name("TicketReportPropertyGrid")
        .Columns(columns =>
        {
            columns.Bound(c => c.ID).Hidden();
            columns.Bound(c => c.PropertyName).Title("Property Name").EditorTemplateName("_PropertyNameEditor").Width(900);
            columns.Bound(c => c.Amount).Title("Amount").Format("{0:C}").Width(90);
            columns.Command(c => c.Custom("Delete").Click("DeleteRecord"));
        })
        .Events(events => events.DataBound("Databound").SaveChanges("SaveGrid").Edit("Edit"))
        .ToolBar(toolbar =>
        {
            toolbar.Create();
            toolbar.Save();
        })
        .Editable(editable => editable.Mode(GridEditMode.InCell).DisplayDeleteConfirmation(false))
        .DataSource(dataSource => dataSource
            .Ajax()
            .Batch(true)
            .ServerOperation(false)
            .Model(model =>
            {
                model.Id(c => c.ID);
                model.Field(c => c.PropertyName);
                model.Field(c => c.Amount);
            })
            .Events(events =>
            {
                events.RequestEnd("onRequestEnd");
            })
            .Read(read => read.Action("GetData", "TicketReportProperty", Model))
            .Create(create => create.Action("AddTicketReportProperty", "TicketReportProperty"))
            .Update(update => update.Action("UpdateTicketReportProperty", "TicketReportProperty"))
            .Destroy(delete => delete.Action("DeleteTicketReportProperty", "TicketReportProperty"))
       )
    )

进行更新时,将调用以下控制器方法:

    [HttpPost]
    public ActionResult UpdateTicketReportProperty([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<TicketReportPropertyEntity> ticketReportPropertyList)
    {
        TicketReportPropertyModel model = new TicketReportPropertyModel();
        model = new TicketReportPropertyModel().UpdateTicketReportProperties(ticketReportPropertyList);
        if (!model.Success)
        {
            ModelState.AddModelError("TicketReportProperty", model.ErrorDescription);
        }
        return Json(new[] { model.TicketReportPropertyList }.ToDataSourceResult(request, ModelState));
    }

执行Update后,我需要的所有数据都将填充到ticketReportPropertyList参数中,并且我可以更新数据库

但是,在执行Create操作时,控制器的方法被命中,但是ticketReportPropertyList并未填充我在Update期间需要的一些参数。

添加新记录时,将调用以下方法:

    [HttpPost]
    public ActionResult AddTicketReportProperty([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<TicketReportPropertyEntity> ticketReportPropertyList)
    {
        TicketReportPropertyModel model = new TicketReportPropertyModel();
        model = new TicketReportPropertyModel().AddTicketReportProperty(ticketReportPropertyList);

        if (!model.Success)
        {
            ModelState.AddModelError("TicketReportProperty", model.ErrorDescription);
        }
        return Json(new[] { model.TicketReportPropertyList }.ToDataSourceResult(request, ModelState));
    }

这是TicketReportPropertyEntity:

public class TicketReportPropertyEntity
{
    public int ID { get; set; }
    public int TicketID { get; set; }
    public decimal Amount { get; set; }
    public string PropertyName { get; set; }
    public int ReportPropertyID { get; set; }
}

我在这里想念什么?

2 个答案:

答案 0 :(得分:0)

我相信您只需替换以下即可解决您的问题:

[Bind(Prefix = "models")]IEnumerable<TicketReportPropertyEntity> ticketReportPropertyList

使用

TicketReportPropertyEntity ticketReportPropertyList

创建每一行时您没有发送列表,只是发送了一个对象。

答案 1 :(得分:0)

好,因此对于create kendo,将初始化一个新的TicketReportPropertyList,然后绑定列中的值。因此,您缺少的列将为空。解决该问题的一种机制是为模型定义中的那些列指定DefaultValue。该值可以来自模型中的字段,设置值,隐藏值等。因此,我通常有一个模型,用于显示网格的页面以及添加项的值。然后我可以这样做:

.Model(model =>
 {
    model.Id(c => c.ID);
    model.Id(c => c.TicketID).DefaultValue(Model.TicketID);
    model.Id(c => c.ReportPropertyID).DefaultValue(Model.ReportPropertyID);
    model.Field(c => c.PropertyName);
    model.Field(c => c.Amount);
})

另一种方法是处理网格的edit event,检查插入并设置值:

if (e.model.isNew()) {
    model.set("TicketID", $("#TicketID).val());  // hidden
    model.set("ReportPropertyID", $("#ReportPropertyID).val());  // hidden
}