【发布时间】:2011-12-08 18:06:41
【问题描述】:
我认为有以下代码:
<%= Html.ListBoxFor(c => c.Project.Categories,
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
<%= Html.ListBox("MultiSelectList",
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 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",
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
我显然不明白这里发生的魔法。
更新 2
好的,这纯粹是命名,例如,这行得通...
<%= Html.ListBox("Project_Tags",
new MultiSelectList(Model.Tags, "Id", "Name", Model.Project.Tags.Select(t => t.Id)))%>
...因为字段名称是 Project_Tags,而不是 Project.Tags,实际上,除了 Tags 或 Project.Tags 之外的任何内容都可以。我不明白为什么这会导致问题(除了它与实体名称匹配),而且我在这方面做得不够好,无法深入了解。
【问题讨论】:
-
我遇到了类似的问题。具体来说,尽管我是根据另一个值从控制器内为列表框(在模型上)设置我选择的值。为了让它工作,我必须设置 ModelState["Categories"].Value。我不喜欢这样,但是 ModelState 对象可以在模型本身上使用的想法充其量是令人困惑的,最坏的情况是令人愤怒。
标签: asp.net-mvc listbox