Sun*_*nny 0 c# asp.net-mvc asp.net-core-mvc
我试图从下拉列表中清除所选值,但值仍然是持久的.这是使用相同的行为@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 });
}
Run Code Online (Sandbox Code Playgroud)
视图
@model WebApplication1.Controllers.HomeModel
<select asp-for="Category" asp-items="@Model.Categories"></select>
<select asp-for="Type" asp-items="@Model.Types"></select>
Run Code Online (Sandbox Code Playgroud)
模型
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" },
};
}
Run Code Online (Sandbox Code Playgroud)
我试图在Category下拉列表中添加一个空值,但仍然没有运气.
<select asp-for="Category" asp-items="@Model.Categories">
<option value="">Select Category</option>
</select>
Run Code Online (Sandbox Code Playgroud)
问题在于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 });
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |