Kendo ComboBox Selection не относится к базовой модели представления - PullRequest
0 голосов
/ 30 октября 2019

Я использую Kendo UI в ASP.NET MVC, и мне еще не удалось связать Kendo ComboBox с базовым свойством ViewModel, используя мою текущую настройку шаблона редактора. ComboBox был настроен так, чтобы иметь предварительно заполненный раскрывающийся список и отображать предложения, основанные на том, что пользователь ввел в поле. Предложения и автоматическое заполнение работают отлично, и я могу выбрать из своего предварительно созданного списка, но каждый раз, когда моя ViewModel возвращается в контроллер, свойство равно нулю, как будто ничего не было выбрано. Я использую шаблон редактора, который принимает тип свойства, используя @Html.EditorFor(m => m.Label, "LabelTemplate") для привязки к свойству ViewModel на странице, а затем @Html.ComboBoxFor(m => m) для привязки редактора к отдельным свойствам объекта. Вот код, который я использую (сокращенно, чтобы содержать соответствующие разделы):

Моя ViewModel:

public class MyViewModel
{  
    [Column("Label")]
    public LabelModel Label { get; set; }
}

LabelModel:

public class LabelModel
{
    public int Id { get; set; }
    public char Character { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public override string ToString() => Name;
}

Шаблон редактора LabelModel

@model MyProject.Models.LabelModel

<script>
    function editLabelCode() {
        return {
            text: $("#EditLabelList").data("kendoComboBox")._prev
        };
    }
</script>

@(Html.Kendo().ComboBoxFor(m => m)
    .Name("EditLabelList")
    .Placeholder("Enter Label Name")
    .DataValueField("Code")
    .DataTextField("Name")
    .Filter(FilterType.Contains)
    .AutoBind(true)
    .MinLength(1)
    .DataSource(source =>
    {
        source.Read(read =>
        {
            read.Action("Labels_Read", "Data")
                .Data("editLabelCode");
        })
        .ServerFiltering(true);
    })
)

MainView.cshtml:

@model SafetyPortalWeb.Models.MyViewModel

@Html.EditorFor(m => m.Label, "LabelTemplate")
@Html.ValidationMessageFor(m => m.Label)

Как уже упоминалось выше, ComboBox идеально заполняет выбор списка. У меня нет проблем, потянув за свой предварительно сгенерированный список или используя функцию поиска и предложения ComboBox. Когда я сохраняю, это свойство LabelModel возвращает null для всех его значений. Есть другие свойства ViewModel, которые заполняются правильно (я не включил их здесь, чтобы сократить код, который я вставляю), так что это не общая проблема с привязкой или сохранением модели.

Я относительно новичок в ASP.NET MVC, поэтому я полностью ожидаю, что есть что-то очевидное, что я могу упустить. Я изучал подобные вопросы SO в течение нескольких дней, и до сих пор не нашел ответа, который сработал бы для этой установки. Есть ли что-то очевидное, что я делаю не так?

** Обновление **:

Я стал немного ближе, следуя совету @SteveGreene, и пошел еще дальше.

Если я удаляю свойство .Name() из ComboBox и вместо этого связываю его со свойством в LabelModel вместо самой модели, я могу получить значения, возвращаемые для свойства, которое я связываюк. Однако я надеюсь, что смогу связать весь объект LabelModel и установить для этого объекта соответствующее свойство в ViewModel. Т.е. ...

@(Html.Kendo().ComboBoxFor(m => m.Code)
    .Placeholder("Enter Label Name")
    .DataValueField("Code")
    .DataTextField("Name")
    .Filter(FilterType.Contains)
    .AutoBind(true)
    .MinLength(1)
    .DataSource(source =>
    {
        source.Read(read =>
        {
            read.Action("Labels_Read", "Data")
                .Data("editLabelCode");
        })
        .ServerFiltering(true);
    })
)

Сконфигурированный таким образом, я могу установить свойство Code в LabelModel, выбрав элемент, но ни одно из других свойств не будет перенесено из выбора ComboBox. Я знаю, что они присутствуют в элементе, потому что Name используется в качестве отображаемого текста для каждого элемента, и они отображаются правильно. Есть ли способ убедиться, что я установил весь объект, когда он выбран? Попытка привязки к модели с использованием ComboBoxFor(m => m) вместо этого не приводит к установке свойств при выборе.

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