DropDownList绑定值后ModelState.IsValid仍为false问题求助
ModelState.IsValid始终返回false的排查与解决
尽管所有属性值已正确绑定并传递至HttpPost方法,且数据类型符合要求,但ModelState.IsValid始终返回false,无法执行数据库写入操作。调试发现CategoryList为null且状态无效。
模型代码
public class Product { [Key] public int ProductID { get; set; } public string ProductName { get; set; } public string ProductDescription { get; set; } public int CategoryID { get; set; } public Category Category { get; set; } } public class Category { [Key] public int CategoryID { get; set; } public string CategoryName { get; set; } }
ViewModel代码
public class ProductViewModel_02 { public string ProductName { get; set; } public string ProductDescription { get; set; } [Required(ErrorMessage = "请选择分类")] public int? CategoryID { get; set; } public IEnumerable<SelectListItem> CategoryList { get; set; } }
控制器代码
[HttpGet] public IActionResult Create() { var model = new ProductViewModel_02() { CategoryList = GetCategoriesListItems() }; return View(model); } [HttpPost] public IActionResult Create(ProductViewModel_02 pvm) { if(ModelState.IsValid) { return RedirectToAction("Index"); } pvm.CategoryList = GetCategoriesListItems(); return View(pvm); } private IEnumerable<SelectListItem> GetCategoriesListItems() { return db.Categories.Select(x => new SelectListItem { Value = x.CategoryID.ToString(), Text = x.CategoryName }); }
视图代码
@Html.DropDownListFor(x => x.CategoryID, new SelectList(Model.CategoryList, "Value", "Text"), "请选择分类", new{})
问题原因
CategoryList仅作为下拉框的数据源用于渲染视图,不会通过表单提交到后端。但模型绑定机制会尝试对ViewModel的所有属性进行绑定,由于表单中没有CategoryList的提交数据,导致该属性绑定失败,进而触发ModelState验证错误。
解决方法
方法1:给CategoryList添加[BindNever]特性
在ViewModel的CategoryList属性上添加[BindNever],告知模型绑定器跳过该属性的绑定操作:
public class ProductViewModel_02 { // 其他属性... [BindNever] public IEnumerable<SelectListItem> CategoryList { get; set; } }
方法2:在HttpPost方法中移除CategoryList的ModelState错误
若不想修改ViewModel,可在HttpPost方法中手动移除CategoryList对应的验证错误:
[HttpPost] public IActionResult Create(ProductViewModel_02 pvm) { ModelState.Remove("CategoryList"); if(ModelState.IsValid) { return RedirectToAction("Index"); } pvm.CategoryList = GetCategoriesListItems(); return View(pvm); }
额外排查点:确认CategoryID是否被正确提交。若用户选择了下拉框的默认"请选择分类"选项,CategoryID会是null,而它带有[Required]特性,这也会导致ModelState.IsValid为false,需确保用户必须选择有效分类选项。
内容的提问来源于stack exchange,提问作者Paul Falaju
相关产品推荐
相关产品推荐

