Я использую 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)
вместо этого не приводит к установке свойств при выборе.