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 视图需要将选定的下拉列表和日历日期传递给模型

使用AngularJS在下拉列表中按选定值启用/禁用按钮

使用 C# 在 ASP.NET MVC 3 中创建级联下拉列表的最简单方法

带有选取器(分段控件)子视图和选择手势的列表项