C# mvc 3 在视图中使用带有选定值的选择列表
Posted
技术标签:
【中文标题】C# mvc 3 在视图中使用带有选定值的选择列表【英文标题】:C# mvc 3 using selectlist with selected value in view 【发布时间】:2011-06-02 13:12:38 【问题描述】:我正在开发一个 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 SelectListItemText = x.Name, Value = x.Id.ToString(), Selected = x.Id.Equals(blogToEdit.Category.Id)).ToList();
selectList.Insert(0, new SelectListItemText = 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)
当我运行代码并打开视图以编辑我的博客时,我可以看到所有正确的数据。选择列表也正确呈现,但我想要选择的项目丢失了它的选择。怎么会这样?直到视图模型与视图一起返回为止,一切都很好。但是当我在浏览器中查看网页时,选择列表只有在没有正确选择的情况下才存在。我在这里想念什么?还是做错了?
【问题讨论】:
【参考方案1】:@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)
【讨论】:
很确定你是对的,但是,属性应该命名为 CategoryId,而不是 SelectedValue(我知道,有点吹毛求疵,反正 +1 :)) 感谢您快速而清晰的回答!效果很好! @Chris Shaffer,是的,我同意将其命名为CategoryId
而不是 SelectedValue
更好,因为它可以更好地反映其目的。
@Chris Shaffer。将属性命名为 CategoryId 并稍微更改了实现。如前所述,效果很好。谢谢!
我在 categories.Select(x => new SelectListItem..).ToList() 上遇到错误。相反,我不得不使用 categories.ToList().Select(x => new SelectListItem..),因为第一个 Linq 查询无法解析到数据库。除非 1+【参考方案2】:
我很确定我以前使用过选择列表项的 selected=true 属性效果很好。我遇到的一个问题是 ViewData 中的值冲突。
【讨论】:
是的,我也是,但那是在 MVC2 中。这个解决方案有效,所以我很高兴以上是关于C# mvc 3 在视图中使用带有选定值的选择列表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.net MVC C# 中使用 Linq 从多个表中选择具有最大计数值的记录
Javascript将具有多个值的选定选项从一个列表移动到另一个列表
ASP.NET MVC 视图需要将选定的下拉列表和日历日期传递给模型