kendo mvc editor не привязан к выбранному раскрывающемуся свойству - PullRequest
0 голосов
/ 27 июня 2018

Используя встроенное редактирование из сетки кендо (v 2017.3.913), шаблон редактора, используемый для раскрывающегося списка, не использует идентификатор свойства для установки выбранного значения в списке (или это другая проблема, но связанная).

Я попробовал несколько решений из однотипных вопросов SO, но ничто не дало ожидаемых результатов.

сетка кендо

//ParentOrganization is the target property
@(Html.Kendo().Grid<OrganizationGridViewModel>()
      .Name("organizationGrid")
      .Columns(columns =>
          {
              columns.Bound(o => o.Id).Width(150).Hidden(true);
              columns.Bound(o => o.Name);
              columns.Bound(o => o.ParentOrganization).ClientTemplate("#= (ParentOrganization.Id == 0) ?  ' ' : ParentOrganization.Name #").EditorTemplateName("ParentOrganization");
              columns.Bound(o => o.OrganizationTypeDescription).Width(165);
              columns.Command(command =>
                    {
                         command.Edit().Text(" ").HtmlAttributes(new { title = "Edit Organization" });
                         command.Destroy().Text(" ").HtmlAttributes(new { title = "Delete Organization" });
                     }).Width(250);
              })
              .ToolBar(toolbar => toolbar.Create().Text("New"))
              .Editable(editable => editable.Mode(GridEditMode.InLine).ConfirmDelete("Are you sure you want to delete this organization?")
              .DisplayDeleteConfirmation("Organization deleted"))
       ...

Поскольку связанный столбец является навигационным объектом (в отличие от примитивного типа), я использую [UIHint] в модели представления для указания на шаблон редактора, чтобы объект отображался правильно.

видовая модель, используемая в сетке

public class OrganizationGridViewModel
{
    ...
    // NOTE: the Organization object has "Id" and "Name" properties
    [UIHint("ParentOrganization")]
    public Organization ParentOrganization { get; set; }
}

редактор шаблонов

@(Html.Kendo().DropDownList()
      .Name("ParentOrganization")
      .DataTextField("Text")
      .DataValueField("Value")
      .BindTo((IEnumerable) ViewData["OrganizationSelectList"])
)

И, наконец, данные, используемые раскрывающимся списком:

var orgSelectList = organizations.Select(n => new SelectListItem
            {
                Text = n.Name,
                Value = n.Id.ToString()
            }).ToList();

ViewData["OrganizationSelectList"] = new SelectList(orgSelectList, "Value", "Text");

Примечание

Я также попытался создать SelectList с использованием «Id» и «Name» (также распространял изменение в редакторе - заменил «Value» и «Text»), чтобы он выровнялся с объектом ParentOrganization, но это закончилось создание "неопределенных" элементов списка.

orgSelectItems.AddRange(organizations.Select( n => new BaseSelectItem
{
      Id = n.Id,
      Name = n.Name
}));

ViewData["OrganizationSelectList"] = new SelectList(orgSelectList, "Id", "Name");

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Похоже, что [сами помощники Kendo или MVC] не любят, когда вы используете «правильные» [Domain] объекты - похоже, запутывает привязку. Я считаю, что основной причиной является то, что имена свойств одинаковы (Id & Name) и должны быть разными. Я использовал объект домена Organization в качестве типа свойства. Я создал другую модель представления для представления организации и использовал разные имена свойств:

новая модель представления для представления организации

вместо того, чтобы использовать «Id» и «Имя» в качестве сопоставленных свойств текста и значений, я использую следующие свойства «ParentOrganization-x»:

public class ParentOrganizationViewModel
{
    public int? ParentOrganizationId { get; set; }
    public string ParentOrganizationName { get; set; }
}

Таким образом, обновление модели вида сетки будет отражать новую модель представления организации:

public class OrganizationGridViewModel
{
     ...

     [UIHint("ParentOrganization")]
     public ParentOrganizationViewModel ParentOrganization { get; set; }
}

Кроме того, вместо возврата SelectList в качестве источника данных в раскрывающийся список, это прямой список моделей представления:

var orgSelectList = organizations.Select(n => new ParentOrganizationViewModel()
{
    ParentOrganizationName = n.Name,
    ParentOrganizationId = n.Id
}).ToList();

ViewData["OrganizationSelectList"] = orgSelectList;

Последние изменения внесены в шаблон редактора, чтобы изменить свойства DataTextField и DataValueField в соответствии с моделью представления org:

@(Html.Kendo().DropDownList()
     .Name("ParentOrganization")
     .DataTextField("ParentOrganizationName")
     .DataValueField("ParentOrganizationId")
     .AutoBind(true)
     .ValuePrimitive(true)
     .BindTo((IEnumerable) ViewData["OrganizationSelectList"])
)    
0 голосов
/ 27 июня 2018

Вот как я получаю данные из выпадающих списков Kendo и из них

@(Html.Kendo().DropDownList()
              .Name("showProcessed")
              .DataTextField("OptionText") 
              .DataValueField("ViewOption")
              .AutoBind(true)
              .SelectedIndex(2)
              .Events(e => e.Change("fe_DiaryItem.processedChange"))
              .HtmlAttributes(new { style = "width: 250px;" })
              .DataSource(ds =>
              {
                 ds.Read("DiaryGridViewOptions", "ControllerName");
              })
)

В этом случае я заполняю объект DataSource и выбираю индекс с помощью .SelectedIndex (x).

У меня есть другие примеры того, как установить индекс, если вам нужно, но это работает производственный код.

---- ---- Edit

@{
    var idxDst = 0;
    if (Model.DiaryTimeSlot != null && Model.DiaryTimeSlotSelectedId > 0)
    {
        idxDst = Model.DiaryTimeSlot.IndexOf(Model.DiaryTimeSlot.First(x => x.DiaryTimeSlotID == Model.DiaryTimeSlotSelectedId));
    }
}

@(Html.Kendo().DropDownList()
              .Name("DiaryTimeSlot")
              .DataTextField("Description")
              .DataValueField("DiaryTimeSlotID")
              .SelectedIndex(idxDst)
              .BindTo(Model.DiaryTimeSlot)
              .DataSource(ds =>
              {
                ds.Read("DiaryTimeSlotOptions", "ControllerName");
              })
) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...