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.PersistentGenericBag1[EmpLaceMgmt.Models.Lam]”的对象强制转换为类型为“System.Collections.Generic.List
1[EmpLaceMgmt.Models.Lam]”@erik@soumer-那么,您不应该直接将实体传递到视图或在模型绑定中使用它们,而应该创建类似的视图模型对象,并使用AutoMapper之类的工具将它们映射到您的实体。这说明了我的观点。。nHibernate期望的是某种GenericBag对象,而不是一个列表,MVC究竟应该如何创建它呢?