MVC2 ListBox没有从View绑定到Controller

时间:2014-03-14 14:25:47

标签: c# nhibernate asp.net-mvc-2

我在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件

我该怎么做?

2 个答案:

答案 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);
}