asp.net-mvc – 为什么ListBoxFor不选择项目,但ListBox是?

我在我的视图中有以下代码
<%= Html.ListBoxFor(c => c.Project.Categories,new MultiSelectList(Model.Categories,"Id","Name",new List<int> { 1,2 }))%>

<%= Html.ListBox("MultiSelectList",2 }))%>

唯一的区别是,第一个助手是强类型(ListBoxFor),它无法显示所选项目(1,2),即使项目出现在列表中等等。更简单的ListBox是按预期工作。

我显然缺少这里的东西。我可以使用第二种方法,但这真的在欺骗我,我想知道。

供参考,我的模型是:

public class ProjectEditModel
{
    public Project Project { get; set; }
    public IEnumerable<Project> Projects { get; set; }
    public IEnumerable<Client> Clients { get; set; }
    public IEnumerable<Category> Categories { get; set; }
    public IEnumerable<Tag> Tags { get; set; }
    public ProjectSlide SelectedSlide { get; set; }
}

更新

我刚刚将ListBox名称更改为Project.Categories(匹配我的模型),现在它失败选择项目。

<%= Html.ListBox("Project.Categories",2 }))%>

我显然不明白这里发生的魔法。

更新2

好的,这是纯粹命名,例如,这工作…

<%= Html.ListBox("Project_Tags",new MultiSelectList(Model.Tags,Model.Project.Tags.Select(t => t.Id)))%>

…因为字段名称是Project_Tags,而不是Project.Tags,事实上,除了Tags或Project.Tags之外的任何东西都将工作。我不明白为什么这会导致一个问题(除了它匹配实体名称),我不够好,在这能够挖掘和找出。

解决方法

我自己偶然遇到了这个问题,最后我意识到这个问题是一个命名约定。

您不能将包含SelectList或MultiSelectList的ViewBag或ViewData poperty命名为包含所选项目的属性模型的相同名称。至少不是如果你使用ListBoxFor或DropDownListFor帮手。

这里有一个例子:

public class Person
    {
          public List<int> Cars { get; set; }
    }

    [HttpGet]
    public ActionResult Create()
    {
          //wont work
          ViewBag.Cars = new SelectList(carsList,"CarId","Name"); 

          //will work due to different name than the property.
          ViewBag.CarsList = new SelectList(carsList,"Name"); 

          return View();
    }

    //View
    @Html.ListBoxFor(model => model.Cars,ViewBag.CarsList as SelectList)

我相信大量的其他方式做这个,但它解决了我的问题,希望它会帮助别人!

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...