Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC NHibernate-将多选列表绑定到IList<;T>;_C#_Asp.net Mvc_Nhibernate - Fatal编程技术网

C# ASP.NET MVC NHibernate-将多选列表绑定到IList<;T>;

C# ASP.NET MVC NHibernate-将多选列表绑定到IList<;T>;,c#,asp.net-mvc,nhibernate,C#,Asp.net Mvc,Nhibernate,如何将多选下拉列表绑定到手动添加的中间表的列表属性 课程 public class Department { public virtual int Id { get; set; } public virtual IList<Lam> Lams { get; set; } } public class Person { public virtual int Id { get; set; } public virtual IList<Lam>

如何将多选下拉列表绑定到手动添加的中间表的列表属性

课程

public class Department
{
    public virtual int Id { get; set; }
    public virtual IList<Lam> Lams { get; set; }
}

public class Person
{
    public virtual int Id { get; set; }
    public virtual IList<Lam> Lams { get; set; }
}

public class Lam
{
    public virtual int Id { get; set; }
    public virtual Department Department { get; set; }
    public virtual Person Person { get; set; }
}
<select class="form-controll" id="Department_Lams" multiple="multiple" name="Department.Lams">
    <option value="1">Example Person</option>
</select>
创建视图

@Html.ListBoxFor(model => model.Department.Lams, new MultiSelectList(Model.Persons, "Id", "Name"), new { @class = "form-controll" })
我试着添加这样的列表框

@Html.ListBoxFor(model => model.Department.Lams, new SelectList(Model.Persons, "Id", "Name"), new { @class = "form-controll" })

要保存该对象,我需要返回一个部门对象

[HttpPost]
public ActionResult Create(Department department)
从下拉列表(带人员)到IList的绑定不起作用。我该怎么做?这可能吗


[编辑]根据Erik的建议编写代码 创建操作结果

    public ActionResult Create()
    {
        // Get all Persons
        var persons = repositoryPerson.GetAll();

        // Create ViewModel
        var viewModel = new DepartmentCreateEditViewModel() { Department = new Department(), Persons = persons };

        // Display View
        return View(viewModel);
    }
[HttpPost]
public ActionResult Create(DepartmentCreateEditViewModel viewModelPostBack)
查看

@Html.ListBoxFor(model => model.Department.Lams, new MultiSelectList(Model.Persons, "Id", "Name"), new { @class = "form-controll" })
我得到的回报:

viewModelPostBack
{EmpLaceMgmt.ViewModels.DepartmentCreateEditViewModel}
    Department: {EmpLaceMgmt.Models.Department}
    Persons: null
viewModelPostBack.Department
{EmpLaceMgmt.Models.Department}
    Id: 0
    Lams: Count = 0
生成的HTML如下所示

public class Department
{
    public virtual int Id { get; set; }
    public virtual IList<Lam> Lams { get; set; }
}

public class Person
{
    public virtual int Id { get; set; }
    public virtual IList<Lam> Lams { get; set; }
}

public class Lam
{
    public virtual int Id { get; set; }
    public virtual Department Department { get; set; }
    public virtual Person Person { get; set; }
}
<select class="form-controll" id="Department_Lams" multiple="multiple" name="Department.Lams">
    <option value="1">Example Person</option>
</select>

模范人物

您有三个问题。首先,您试图绑定到一个
IList
,但这不起作用,因为模型绑定器不知道应该创建什么样的具体对象来满足。。。有许多对象支持IList,那么是哪一个

其次,您需要在助手中使用
MultiSelectList
,而不是
SelectList

第三,您发回的模型类型与您用于创建页面的模型类型不同。这种类型有一个非常不同的结构。在您创建页面时使用的结构中,您的数据是以
部门.Lams
的名称创建的(因为
部门
是ViewModel的一个属性),但在您的Post操作中使用了
部门
模型,绑定器将查找一个简单称为
Lams
的对象,不是
部门。Lams

因此,将您的模型转换为使用具体类型,例如
列表
,然后发回您的ViewModel而不是Department,并从ViewModel中提取部门,最后将您的助手更改为:

@Html.ListBoxFor(model => model.Department.Lams, 
    new MultiSelectList(Model.Persons, "Id", "Name"), new { @class = "form-controll" })

你似乎对你想要的是下拉列表还是列表框感到困惑,到底是哪一个?没关系。我只需要能够选择多个人,然后在我的中间表中存储。但是我不知道如何以正确的方式进行绑定,我使用web.api/JSON来交换数据。在该场景中,person表示根对象,lam是依赖集合。这样,我可以一次性传递根目录及其集合中的相关项。我对mvc不太清楚。检查:@radim I尝试创建一个Lam对象,并将其引用给部门和人员。我还将cascade设置为all。在将Lam对象添加到Department.Lams并尝试保存后,我收到以下错误消息:无法将值NULL插入列'id',table'.\DATABASE.MDF.dbo.Lam';列不允许空值。插入失败。声明已终止。虽然我在Lam对象上将Id设置为自动递增。如果Id列为IDENTITY,并且映射使用本机生成器,则所有这些都必须工作。换句话说,这条消息似乎与DB中的错误设置有关。但你就快到了。仔细检查列ID是否为IDENTITY(1,1)。xml应该包含
,我只是在标题中写了IList,因为我想让问题更一般。我的部门已经有一个IList类型的属性。我将SelectList更改为MultiSelectList&将ActionResult更改为ViewModel。但它似乎不起作用。我将用我的新代码更新我的问题。@soumer-你不明白我写了什么。我建议你再仔细读一遍。你的第二点很清楚。我改了。您的第一点:我应该将模型属性从
IList
更改为
List
对吗?但随后我收到以下错误消息:无法将类型为“NHibernate.Collection.Generic.PersistentGenericBag
1[EmpLaceMgmt.Models.Lam]”的对象强制转换为类型为“System.Collections.Generic.List
1[EmpLaceMgmt.Models.Lam]”@erik@soumer-那么,您不应该直接将实体传递到视图或在模型绑定中使用它们,而应该创建类似的视图模型对象,并使用AutoMapper之类的工具将它们映射到您的实体。这说明了我的观点。。nHibernate期望的是某种GenericBag对象,而不是一个列表,MVC究竟应该如何创建它呢?