创建true
实体时,应从Employee
中选择MeetingCenter
。 DropDownList
的所有MeetingCenters
和DropDownList
都很好显示,但是选中其中一些并创建Names
时,会议中心为Employee
。我正在使用NoSQL DocumentDB数据库。
控制器:
null
创建视图:
[ActionName("Create")]
public async Task<IActionResult> CreateAsync()
{
ViewBag.MeetingCentersList = await _meetingCenterReposiotry.GetItemsAsync();
return View();
}
@model Employee
@using (Html.BeginForm("Create", "Home", FormMethod.Post, new { @class = "form-horizontal" }))
{
...
<div class="form-group">
@Html.LabelFor(MeetingCenter => Model.MeetingCenter, new { @class = "control-label" })
@Html.DropDownListFor(MeetingCenter => Model.MeetingCenter, new SelectList(ViewBag.MeetingCentersList, "MeetingCenterId", "Name"), new { @class = "form-control" })
</div>
...
}
模型的部分
Employee
public class Employee
{
...
[JsonProperty(PropertyName = "id")]
public string EmployeeId { get; set; }
[JsonProperty(PropertyName = "meetingCenter")]
public MeetingCenter MeetingCenter { get; set; }
...
}
模型的部分
MeetingCenter
答案 0 :(得分:0)
使用您当前的代码,listen
帮助器将呈现一个带有选项的SELECT元素,该元素具有DropDownListFor
作为value属性和MeetingCenterId
作为Text。 SELECT元素的名称属性值将为Name
。因此,提交表单后,表单数据将如下所示
MeetingCenter
假设用户选择值为“ 2”的选项。
但是视图模型(MeetingCenter: 2
)的MeetingCenter
属性不是数字类型,而是复杂类型(Employee
)。因此,模型联编程序无法将此值映射到视图模型的MeetingCenter
属性。
您可以使用名称MeetingCenter
渲染SELECT元素,然后模型绑定器将能够映射已发布的表单数据,因为输入元素的名称与您的视图模型的命名结构匹配。
因此,您应该在表单内部呈现这样的内容。
MeetingCenter.MeetingCenterId
您可以通过使用SELECT标记帮助器并将<select name="MeetingCenter.MeetingCenterId">
</select>
指定为MeetingCenter.MeetingCenterId
属性来生成上述标记。
asp-for
现在,提交表单后,它将填充视图模型的<select asp-for="MeetingCenter.MeetingCenterId"
asp-items="@(new SelectList(ViewBag.MeetingCentersList,
"MeetingCenterId", "Title"))">
</select>
属性,并且是MeetingCenter
属性。
如果您要填充完整的MeetingCenterId
属性(MeetingCenter
以外的属性,请使用MeetingCenterId
中提供的MeetingCenterId通过查询_meetingCenterReposiotry.GetItemsAsync()
提供的数据来获取完整的对象。 HttpPost操作。类似这样的
var id = viewModel.MeetingCenter.MeetingCenterId;
var items = await _meetingCenterReposiotry.GetItemsAsync();
var item = items.FirstOrDefault(a=>a.MeetingCenterId==id);
// User item now
// May be do somethig like : viewModel.MeetingCenter = item;
我还建议您使用正确的类型。如果MeetingCenterId
是数字值,请使用int
作为类型,而不要使用string