Выпадающий список не очищается

Я пытаюсь удалить выбранное значение из раскрывающегося списка, но значение все еще сохраняется. Такое же поведение при использовании @Html.DropDownListFor.

Контроллер

public class HomeController : Controller
{

    [Route("/Home/Index")]
    [Route("/Home/Index/{Category}")]
    [Route("/Home/Index/{Category}/{Type}")]
    public IActionResult Index(HomeModel model)
    {
        // Issue is here
        // for url: home/index/accessories/test
        // "Category" is cleared if it is not valid "type"
        // but still "Accessories" remains selected in the drop down
        if (model.Type != "Electronics" && model.Type != "Furniture")
        {
            model.Category = string.Empty;
        }

        return View(new HomeModel() { Category = model.Category, Type = model.Type });
    }

Вид

@model WebApplication1.Controllers.HomeModel

<select asp-for = "Category" asp-items = "@Model.Categories"></select>
<select asp-for = "Type" asp-items = "@Model.Types"></select>

Модель

public class HomeModel
{
    public string Category { get; set; }

    public string Type { get; set; }

    public List<SelectListItem> Categories { get; set; } = new List<SelectListItem>
    {
        new SelectListItem() { Text = "Computers & Laptops", Value = "Computers-Laptops" },
        new SelectListItem() { Text = "Accessories", Value = "Accessories" },
    };

    public List<SelectListItem> Types { get; set; } = new List<SelectListItem>
    {
        new SelectListItem() { Text = "Electronics", Value = "Electronics" },
        new SelectListItem() { Text = "Furniture", Value = "Furniture" },
    };
}

Обновлено

Я попытался добавить пустое значение в раскрывающееся меню «Категория», но мне все равно не повезло.

 <select asp-for = "Category" asp-items = "@Model.Categories">
        <option value = "">Select Category</option>
 </select>

В вашем списке выбора нет пустого значения. Попробуйте добавить параметр Text = "".

Kevin Raffay 29.11.2018 23:00

@KevinRaffay Он все еще не работает после добавления пустого значения

Sunny 30.11.2018 16:32

Я думаю, он выбирает значение из маршрута

Sunny 30.11.2018 16:34

Какой HTML создается в браузере?

Llazar 01.12.2018 16:51

Публикуете ли вы что-нибудь в методе при возникновении ошибки? Или просто зайдя по «свежей» ссылке?

JLe 01.12.2018 21:11

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

Sunny 01.12.2018 21:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
305
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в ModelState. Что происходит, так это то, что когда параметры URL привязаны к модели представления, значения добавляются в словарь состояния модели. Когда представление визуализируется, в представление передается не только ваш HomeModel, но и под сценами также передается ModelState - и он имеет более высокий приоритет, чем модель представления. Таким образом, пока вы сбрасываете model.Category, ключ Category в ModelState все еще имеет значение accessories, и поэтому он выбирается в раскрывающемся списке.

Решение простое: вызовите .Clear(), чтобы стереть состояние модели и заставить вашу модель представления победить:

[Route("/Home/Index")]
[Route("/Home/Index/{Category}")]
[Route("/Home/Index/{Category}/{Type}")]
public IActionResult Index(HomeModel model) {
    // Issue is here
    // for url: home/index/accessories/test
    // "Category" is cleared if it is not valid "type"
    // but still "Accessories" remains selected in the drop down
    if (model.Type != "Electronics" && model.Type != "Furniture") {
        model.Category = string.Empty;
    }
    ModelState.Clear();
    return View(new HomeModel() { Category = model.Category, Type = model.Type });
}

Другие вопросы по теме