MVC Kendo Editable Grid не сохраняет значение Enum - PullRequest
0 голосов
/ 03 марта 2020

Я сейчас создаю свою первую сетку кендо. Почти все работает, за исключением того, что мои Status enum и Code (в основном id) не передаются моему контроллеру в действии Create.

Вот моя таблица кендо (части, которые вещество) -

             @(Html.Kendo().Grid<MyViewModel>()
                .Name("grid")
                .AutoBind(false)
                .HtmlAttributes(new { @class = "grid-clickable-edit" })
                .Columns(columns =>
                {
                    columns.Command(command =>
                    {
                        command.Edit().IconClass("fas fa-pencil").UpdateIconClass("fas fa-check").CancelIconClass("fas fa-ban");
                        command.Destroy().IconClass("fas fa-trash");
                    })
                        .ClientHeaderTemplate(Html.GridAddButton())
                        .Width(180);
                    //some fields
                    columns.Bound(model => model.Code)
                        .EditorTemplateName("GridDropdownEditor")
                        .EditorViewData(new {data = ViewBag.CodeList})
                        .ClientTemplate("#:Code#");
                    //some other fields
                    columns.Bound(model => model.StatusId)
                        .EditorTemplateName("StatusEditor");
                        .ClientTemplate("#:StatusName#");
                    //more fields
                })
                .Pageable(pg => pg.Numeric(false).PreviousNext(false))
                .Sortable()
                .Scrollable(scroll => scroll.Virtual(true))
                .Filterable(x => x.Enabled(false))
                .Editable(editable => editable.Mode(GridEditMode.InLine))
                .DataSource(dataSource => dataSource
                    .Ajax()
                    .Batch(true)
                    .ServerOperation(true)
                    .Model(model => { model.Id(m => m.Id); })
                    .Read(...)
                    .Create(update => update.Action(...))
                    .Update(update => update.Action(...))
                    .Destroy(update => update.Action(...))
                ))


ViewBag.CodeList представляет собой список идентификаторов каждого кода, а также описание. Раскрывающийся список показывает идентификатор и описание, объединенные вместе.

GridDropdownEditor -

@model object

@(Html.Kendo().DropDownListFor(m => m)
            .DataTextField("Text")
            .DataValueField("Value")
            .BindTo((IEnumerable<SelectListItem>)ViewData["data"])
)

StatusEditor -

@using MyProject.Data.Models
@using MyProject.Helpers

@(Html.Kendo().DropDownListFor(m => m)
    .DataTextField("Text")
    .DataValueField("Value")
    .BindTo(EnumHelper<BidStatus>.ToSelectList())
    )
    )

Метод EnumHelper.ToSelectList() в основном получает значения String и Id из моего Status Enum, а затем помещает его в SelectList

Status Enum -

public enum Status
{
    Status1 = 1,
    Status2 = 2,
    Status3 = 3
}


MyViewModel (опять же, части, которые имеют значение) -

public int? Code { get; set; }

public Status? StatusId { get; set; }

public string StatusName
{
    get { return StatusId.ToString(); }
}



Раскрывающиеся списки для Status и Code заполняются очень хорошо, но они никогда не собираются сеткой и не передаются контроллеру. К вашему сведению - поля Код и Статус должны быть обнуляемыми. Дайте мне знать, если потребуется дополнительная информация, и я был бы рад включить ее.

То, что я пробовал
Я попытался использовать решения здесь - Кендо MVC сетка с редактируемым столбцом enum , который у меня не работал.

1 Ответ

2 голосов
/ 04 марта 2020

Я полагаю, что проблема возникает из-за того, что выпадающий список привязан к коллекции объектов, поэтому на сервере связыватель не может сопоставить представленный объект со значением перечисления.

Можно попытаться установить для параметра ValuePrimitive раскрывающегося списка значение true, таким образом на сервер будет отправлено только поле значения (Value), а не весь объект.

например

@using MyProject.Data.Models
@using MyProject.Helpers

@(Html.Kendo().DropDownListFor(m => m)
    .DataTextField("Text")
    .DataValueField("Value")
    .ValuePrimitive(true)
    .BindTo(EnumHelper<BidStatus>.ToSelectList())
    )
    )

Сделайте то же самое для обоих выпадающих меню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...