Я пытаюсь удалить выбранное значение из раскрывающегося списка, но значение все еще сохраняется. Такое же поведение при использовании @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>
@KevinRaffay Он все еще не работает после добавления пустого значения
Я думаю, он выбирает значение из маршрута
Какой HTML создается в браузере?
Публикуете ли вы что-нибудь в методе при возникновении ошибки? Или просто зайдя по «свежей» ссылке?
@JLe, я просто открываю в браузере ссылку с этим адресом. Он работает для всех остальных значений, кроме пустой категории.





Проблема в 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 });
}
В вашем списке выбора нет пустого значения. Попробуйте добавить параметр Text = "".