我正在开发MVC3 Web应用程序。我希望从应用程序管理系统编辑blo时显示的类别列表。在我的视图模型中,我为类别的selectlistitems列表定义了以下属性。
/// <summary> /// The List of categories /// </summary> [Display(Name = "Categorie")] public IEnumerable<SelectListItem> Categories { get; set; }
下一步,我的控制器将包含以下编辑操作,其中将从数据库中填充selectlistitems的列表。
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 //at this point i see the expected item being selected //Categories = new IEnumerable<SelectListItem>(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)
运行代码并打开视图以编辑博客时,我可以看到所有正确的数据。选择列表也正确呈现,但是我要选择的项目丢失了它的选择。怎么会这样?直到返回带有视图的视图模型为止,一切正常。但是,当我在浏览器中查看网页时,仅存在正确选择的选择列表。我在这里想念什么?还是做错了?
@Html.DropDownListFor(model=>model.Categories, Model.Categories, Model.CategoryId)
在这里,您没有正确使用助手方法。第一个参数必须是视图模型上的属性,该属性将包含当前选定的值。它应该是标量属性,而不是集合。
因此,在您的视图模型中,您需要添加以下属性:
[Display(Name = "Categorie")] public IEnumerable<SelectListItem> Categories { get; set; } public string SelectedValue { 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, // this is what sets the selected value SelectedValue = blogToEdit.Category.Id };
在您看来,简单来说:
@Html.DropDownListFor(x => x.SelectedValue, Model.Categories)