C# MVC 3在视图中使用带有选定值的selectlist
C# MVC 3在视图中使用带有选定值的selectlist
我正在开发一个MVC3的Web应用程序。我希望在编辑文章时,在应用程序管理系统中显示一个类别列表。在我的视图模型中,我为类别的选择列表项定义了以下属性。
////// 类别列表 /// [Display(Name = "类别")] public IEnumerableCategories { get; set; }
下一步,我的控制器包含以下编辑操作,其中选择列表项从数据库中填充。
public ActionResult Edit(Guid id) { var blogToEdit = _blogService.First(x => x.Id.Equals(id)); var listOfCategories = _categorieService.GetAll(); var selectList = listOfCategories.Select(x =>new SelectListItem{Text = x.Name, Value = x.Id.ToString(), Selected = x.Id.Equals(blogToEdit.Category.Id)}).ToList(); selectList.Insert(0, new SelectListItem{Text = Messages.SelectAnItem, Value = Messages.SelectAnItem}); var viewModel = new BlogModel { BlogId = blogToEdit.Id, Active = blogToEdit.Actief, Content = blogToEdit.Text, Title = blogToEdit.Titel, Categories = selectList //在这一点上,我看到了预期的项目被选中 //Categories = new IEnumerable(listOfCategories, "Id", "Naam", blogToEdit.CategorieId) }; return View(viewModel); }
当我在返回视图之前设置断点时,我看到选择列表按照我预期的填充。所以在这一点上一切似乎都没问题。视图模型被完全正确地填充了。
然后在我的视图中(我使用Razor),我有以下两个规则,用于呈现选择列表。
@Html.LabelFor(m => m.Categories) @Html.DropDownListFor(model=>model.Categories, Model.Categories, Model.CategoryId) @Html.ValidationMessageFor(m => m.Categories)
当我运行代码并打开编辑博客的视图时,我可以看到所有正确的数据。选择列表也正确地呈现出来,但是我希望被选中的项目失去了选择。这怎么可能?直到视图模型与视图一起返回的那一点,一切都还好。但当我在浏览器中查看网页时,选择列表只有没有正确的选择。我在这里漏掉了什么?或者做错了什么?
问题出现的原因是在使用C# MVC 3中的SelectList时,如果在ViewData中存在冲突的值,可能会导致selected=true属性无法正常工作。
解决方法是在使用SelectList时,确保ViewData中不存在与之冲突的值。这样可以保证selected=true属性能够正常工作。
示例代码如下所示:
// Controller public ActionResult Index() { // 假设ViewData中存在冲突的值 ViewData["ConflictValue"] = "conflict"; // 创建SelectList,确保与冲突值不匹配 var selectList = new SelectList(new[] { new SelectListItem { Value = "value1", Text = "Text 1" }, new SelectListItem { Value = "value2", Text = "Text 2" }, new SelectListItem { Value = "value3", Text = "Text 3" } }, "Value", "Text", "value2"); // 将SelectList传递给View return View(selectList); } // View @model SelectList
通过以上方法,我们可以解决C# MVC 3中使用SelectList时可能出现的selected=true属性无法正常工作的问题。
问题的原因是在使用DropDownListFor方法时,第一个参数必须是视图模型中的属性,该属性将包含当前选定的值。它应该是一个标量属性,而不是一个集合。
解决方法是在视图模型中添加一个这样的属性,并在控制器动作中设置选定的值。具体代码如下:
[Display(Name = "Categorie")] public IEnumerableCategories { get; set; } public string CategoryId { get; set; }
var selectList = listOfCategories.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() }).ToList(); var viewModel = new BlogModel { BlogId = blogToEdit.Id, Active = blogToEdit.Actief, Content = blogToEdit.Text, Title = blogToEdit.Titel, Categories = selectList, CategoryId = blogToEdit.Category.Id };
在视图中使用DropDownListFor方法,将选定的值绑定到属性CategoryID上:
.DropDownListFor(x => x.CategoryId, Model.Categories)
最后,有读者指出在创建selectList时遇到了错误。解决办法是将categories.ToList()放在前面,然后再使用Select方法创建selectList,因为第一个LINQ查询无法解析到数据库。
以上就是关于在C# MVC 3中使用SelectList并设置选定值的问题的原因和解决方法。