我在NHibernate中有多对多的关系,我正在尝试将Html.ListBoxFor()中的所有项绑定到我的Model,但该列表总是在传递给Controller的Model中有0个项。
这是我到目前为止所得到的:
Role.hbm.xml>多对多关系的“左”方
<bag name="LdapGroups" table="CADU_TB_ROLE_LDAP_OBJECTS" cascade="all">
<key column="ID_ROLE" />
<many-to-many column="ID_LDAP_OBJECT" class="LdapObject" />
</bag>
Role.cs&gt;模型
public class Role {
public virtual IList<LdapObjects> LdapGroups {
get;
set;
}
}
RoleController.cs&gt;控制器
public class RoleController: Controller {
public ActionResult Create(Role obj) {
// Create logic here
// here, obj.LdapGroups.Count is equal to 0, but instantiated
}
}
Create.aspx&gt;查看(右下图)
<%= Html.ListBoxFor(model => model.LdapGroups,
new List<CaduMVC.Models.LdapObject>()
.Select(o => new SelectListItem() {
Value = o.Id.ToString(),
Text = o.Description
}),
new { id="lbSelectedGroups",
@class = "form-control",
style = "height: 120px;" }) %>
这是视图(使用JQuery从左到右传递项目。项类型是 LdapObject )
我需要从 lbSelectedGroups (右侧列表)中获取所有项目并将它们放入 obj(obj.LdapGroups)参数(创建操作),但它随附0件
我该怎么做?
答案 0 :(得分:1)
乍一看我所看到的是点击&gt;&gt;时缺少控制器动作按钮。该操作应该通过jquery获取两个列表中的所有项目使用模式并将一组项目传递给控制器。该操作会将项目推送到第二个框并发送结果。 jquery成功方法从集合中获取数据并重新填充列表框。
答案 1 :(得分:1)
经过一些调试后,我发现Html.ListBoxFor()
方法发送了一组值(value
标签中的option
属性),而不是ListItem
个对象(我在期待)。
我在类型为int[]
的Model对象中创建了一个transient属性,它接收该值列表,然后创建并将deattached对象插入到LdapObjects列表中。如下:
Role.cs&gt;模型
public class Role {
public virtual IList<LdapObjects> LdapGroups {
get;
set;
}
// Transient
public virtual int[] LdapGroupsSelected {
get;
set;
}
}
Create.aspx&gt;查看(上图中的右侧列表)
<%= Html.ListBoxFor(model => model.GruposLdapSelecionados,
new Iesi.Collections.Generic.HashedSet<CaduMVC.Models
.LdapObject>()
.Select(o => new SelectListItem() {
Value = o.Id.ToString(),
Text = o.Descricao,
}),
new { id="lbGruposSelecionados",
@class = "form-control",
style = "height: 120px;" }) %>
RoleController.cs&gt;控制器
public ActionResult Create(Role obj) {
. . .
for(int i = 0; i < obj.LdapGroupsSelected.Length; i++) {
obj.LdapGroups.Add(new LdapObject(Convert.ToInt32(
obj.LdapGroupsSelected[i])));
}
session.Merge(obj);
}