从SelectList中选择项目后,实体设置为null

时间:2018-07-07 19:10:22

标签: c# asp.net-core azure-cosmosdb

创建true实体时,应从Employee中选择MeetingCenterDropDownList的所有MeetingCentersDropDownList都很好显示,但是选中其中一些并创建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

1 个答案:

答案 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