Asp.Net MVC 4 Модель привязки И привязка выбивки для выбора элемента - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть страница, на которой в данный момент используется свойство модели для «списка» элементов для выбора, а также свойство «selectedItems» для уже выбранных.(Это элемент множественного выбора).

Моя проблема в том, что при использовании элемента select, подобного этому:

<select name="SelectedItems" id="SelectedItems" multiple class="form-control chosen-select" data-placeholder="Select Your Items" style="width: 100%">
    @foreach (var item in Model.AvailableItems)
    {
        var itemSelected = Model.SelectedItems.Contains(item) ? " selected " : "";
        <option value="@item.ToString()" @itemSelected>@item.Humanize()</option>
    }
</select>

Он предварительно выбирает соответствующие элементы и список элементов.доступно идеально.Но когда я захожу, чтобы сохранить / опубликовать, он не распознает никаких изменений, поскольку этот элемент не был включен в привязку выбивки.

Итак, когда я включаю его в привязку выбивки, например:

<select name="SelectedItems" id="SelectedItems" multiple class="form-control chosen-select" data-bind="selectedOptions: selectedItems" data-placeholder="Select Your Items" style="width: 100%">
    @foreach (var item in Model.AvailableItems)
    {
        var itemSelected = Model.SelectedItems.Contains(item) ? " selected " : "";
        <option value="@item.ToString()" @itemSelected>@item.Humanize()</option>
    }
</select>

Он НЕ будет загружать уже выбранные элементы, но он УВИДЕТЬ изменения, сделанные при попытке сохранить / опубликовать.

Стоит отметить, что когда я ставлю точку останова внокаутирующий код (см. ниже), где он отображает модель представления, верно, ДО того, как он выполняет ko.applyBindings (), вы можете видеть в браузере, что он действительно правильно выбирает выбранные элементы.Затем, как только ko.applyBindings () выполнится, эти предварительно выбранные элементы исчезнут.

Вот что вылетает из раздела / тега скрипта в моем файле cshtml:

var viewModelJson = '@Html.Json(Model)';
var viewModelJs = {};
var viewModel = {};
viewModelJs = JSON.parse(viewModelJson);
initializeViewModelJs(viewModelJs);
viewModel = ko.mapping.fromJS(viewModelJs);
ko.applyBindings(viewModel);

Как мне заставить это работать как: 1) загрузка выбранных элементов и 2) просмотр изменений, внесенных в выбранные элементы?

1 Ответ

0 голосов
/ 22 февраля 2019

Когда страница загружается и отображается изначально, поскольку у вас есть опции, помеченные как выбранные, они отображаются как выбранные.После привязки к модели представления, я подозреваю, что массив selectedItems пуст, поэтому элементы больше не выбираются, и они очищаются.

Мое решение состоит в том, чтобы сделать все в модели представления.Иметь список параметров, использовать привязку options, а также привязку selectedOptions.Поскольку вы смешиваете серверный и клиентский код, это вызывает такое поведение.

Имейте в виду, что DOM контролируется моделью представления.Он отражает состояние свойств модели представления с помощью привязок data-bind:.

Возможно, вы можете настроить состояние объекта Model, который вы преобразовываете в JSON, а затем в модель представления, чтобы соответствовать состоянию объекта.DOM вы хотите или напишите JavaScript viewmodel.

...