Выпадающий список не показывает правильный выбранный элемент

#asp.net-mvc #asp.net-core #html.dropdownlistfor

#asp.net-mvc #asp.net-core #html.выпадающий список для

Вопрос:

Я пытаюсь создать страницу для создания рецепта, рецепт может содержать несколько тегов.

Это HttpGet, который дает мне представление для создания рецепта

  [HttpGet]
    public ViewResult Index() {
        return View(new RecipeViewModel { 
            TagsFromDb = repository.Tags.ToList()
    }
 

Это моя ViewModel для страницы

 public class RecipeViewModel : Recipe {
    public List<Tag> Tags { get; set; } = new List<Tag>();
    public List<Tag> TagsFromDb { get; set; }
 

На мой взгляд, это кнопка, которая вызывает действие для создания нового тега

<тип ввода = «отправить» asp-действие =»addTag» значение =»Добавить тег» класс =»btn btn-primary» />

И это действие в моем контроллере

     [HttpPost]
    public IActionResult AddTag(RecipeViewModel model) {
        model.Tags.Add(new Tag());
        return View("Index", model);
    }
 

На мой взгляд, это код, который создает новый выпадающий список для каждого добавленного тега

  <div class="form-group">
                @if (Model.Tags.Count > 0) {
                    @for (int i = 0; i < Model.Tags.Count; i  ) {
                        List<SelectListItem> items = new List<SelectListItem>();
                        foreach (Tag tag in Model.TagsFromDb) {
                            items.Add(new SelectListItem() {
                                Text = tag.Name,
                                Value = tag.ID.ToString(),
                                Selected = tag.ID == Model.Tags[i].ID ? true : false
                            });
                        }
                <div class="d-flex justify-content-center">
                    <select asp-for="@Model.Tags[i].ID" asp-items="items" class="form-control">
                        <option value="">Vælg tag</option>
                    </select>
                    <button class="btn-danger" asp-action="RemoveTag" type="submit" name="index" value="@i">X</button>
                </div>
                    }
                }
            </div>
 

И это действие удаления в контроллере

     [HttpPost]
    public IActionResult RemoveTag(RecipeViewModel model, int index) {
        model.Tags.RemoveAt(index);
        return View("Index", model);
    }
 

И здесь возникает головная боль..

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

Как я могу заставить выпадающие списки отображаться с правильными значениями?

Надеюсь, это имеет смысл для кого-то, кто все еще учится и еще не начал работать с javascript, поэтому любое решение без него было бы предпочтительнее, спасибо!

Ответ №1:

Казалось бы, публикация здесь заставила меня решить мою собственную проблему!

Вместо того, чтобы использовать asp-items taghelper для опций, я сделал foreach для SelectListItems в itemlist и заставил его установить selecteditem в if / else

Вот как я это исправил

    <div class="form-group">
                @if (Model.Tags.Count > 0) {
                    @for (int i = 0; i < Model.Tags.Count; i  ) {
                        var items = new List<SelectListItem>(Model.TagsFromDb.Select(tag => new SelectListItem() {
                            Value = tag.ID.ToString(),
                            Text = tag.Name,
                            Selected = tag.ID == Model.Tags[i].ID ? true : false
                        }).ToList());
                        <div class="d-flex justify-content-center">
                            <select asp-for="@Model.Tags[i].ID" class="form-control">
                                <option value="">Vælg tag</option>
                                @foreach (SelectListItem item in items) {
                                    if (item.Selected) {
                                        <option selected="selected" value="@item.Value">@item.Text</option>
                                    }
                                    else {
                                        <option value="@item.Value">@item.Text</option>
                                    }
                                }
                            </select>
                            <button class="btn-danger" asp-action="RemoveTag" name="index" value="@i">X</button>
                        </div>
                    }
                }
            </div>