Kendo.Grid не отправляет некоторые данные в контроллер при операции «Создать» - PullRequest
0 голосов
/ 12 июня 2019

My Kendo.Grid необходимо выполнить операции CRUD с данными на SAVE CHANGES click

Это определение Grid:

    @(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 голосов
/ 13 июня 2019

ОК, поэтому при создании 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);
})

Другим способом будет обработать событие редактирования таблицы , проверить наличие вставок и установить значения:

if (e.model.isNew()) {
    model.set("TicketID", $("#TicketID).val());  // hidden
    model.set("ReportPropertyID", $("#ReportPropertyID).val());  // hidden
}
0 голосов
/ 13 июня 2019

Я считаю, что вашу проблему можно исправить, просто заменив:

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

с

TicketReportPropertyEntity ticketReportPropertyList

Вы не отправляете список при создании каждой строки, вы просто отправляете один объект.

...