Динамическое заполнение выделения с помощью объекта C sharp

#c# #jquery #asp.net-core #razor

#c# #jquery #asp.net-core #razor

Вопрос:

У меня есть список пользовательских объектов (Book), и я хочу, чтобы второе поле выбора заполнялось на основе плитки, выбранной в первом выпадающем списке. Я видел много ответов о том, как это сделать со статически типизированными списками, но не из asp.net объект.

 public class Book
{

    public string Title { get; set; }

    public List<string> Chapter { get; set; }

}
  

Model.books — это список объектов Book, приведенный выше.

В cshtml:

 <div class="form-group">
                        <label asp-for="Book.Title" class="control-label">Title</label>
                        <select id="title-select" asp-for="Book.Title" class="form-control">
                            @foreach (var item in Model.books)
                            {
                                <option value="@item">
                                    @Html.DisplayFor(modelItem => item.Title)
                                </option>
                            }
                        </select>
                    </div>

<div class="form-group">
                        <label asp-for="Book.Chapter" class="control-label">Chapter</label>
                        <select id="chapter-select" asp-for="Book.Chapter" class="form-control">
                            @foreach (var item in chapters?)
                            {
                                //Chapter select based on Title chosen above
                            }
                        </select>
                    </div>
  

jQuery:

     $('#title-select').on('change', function () {
        var value = this.value

//How to pass the book.chapter object into here to populate the dropdown list


    });
  

Книг или глав не так много, поэтому, возможно, стоит просто передать все книги, а не использовать Ajax? В основном я не уверен, как получить список моих книг в jQuery в первую очередь (я не привык к веб-разработке).

Ответ №1:

Вы можете сохранить название книги, связанное с главой, в качестве data-* атрибута для элемента option в раскрывающемся списке chapters.

 @foreach (var book in Model.books)
    @foreach (var item in book.Chapter)
      {
         <option data-book-title="@book.Title">@item</option>
      }
}
  

Затем используйте значение элемента selected book в раскрывающемся списке book, чтобы отфильтровать главы, соответствующие атрибуту data, чтобы включить их:

 $('#title-select').on('change', function () {
  var bookValue = this.value;
  $('#chapter-select option').hide().filter(function(){
    return $(this).data('book-title') == bookValue;
  }).show();
});
  

Комментарии:

1. Спасибо — это помогло мне начать. Мне пришлось добавить .show() в конец вместо hide и метод изменения значения по умолчанию на не скрытое.

2. @Hawke: Виноват. Должно было быть show для отфильтрованного списка. Рад, что это помогает 🙂