【发布时间】:2015-03-06 10:31:34
【问题描述】:
ASP.NET 4.5、MVC 5、EF6 代码优先
我是一个新手,可能会问一些众所周知的问题,但我在网络上找不到解决方案,可能是因为我不知道提出这个问题的正确术语。
为了简单起见,假设我有两个模型类 Teacher 和 Kid;一个孩子只能分配给一位老师,但一位老师可以有多个孩子。因为我首先使用代码,所以我的数据库是由这些模型类构建的:
public class Kid
{
[Required]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public virtual Teacher { get; set; }
}
public class Teacher
{
[Required]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public virtual ICollection<Kid> Kids { get; set; }
}
现在,我需要有一个添加新孩子的视图: 孩子名字的文本框; 带有教师列表的下拉列表
所以,我正在创建一个数据传输对象,专门用于该视图:
public class AddNewKidViewDTO
{
public IEnumerable<SelectListItem> Teachers { get; set; }
public int SelectedTeacherId { get; set; }
public Kid Kid { get; set; }
}
我还有一种填充 IEnumerable Teachers 的方法:
public AddNewKidViewDTO LoadTeachersForDropDownList()
{
... //get the list of Teachers
AddNewKidViewDTO addNewKidViewDTO = new AddNewKidViewDTO();
List<SelectListItem> selectListItems = new List<SelectListItem>();
foreach (teacher in Teachers)
{
selectListItems.Add (new SelectListItem
{
Text = teacher.Name.ToString(),
Value = teacher.Id.ToString()
});
}
addNewKidViewDTO.Teachers = selectListItems;
return addNewKidViewDTO;
}
在视图中 AddNewKid.cshtml
<form>
@Html.LabelFor(model => model.Kid.Name)
@Html.TextBoxFor(model => model.Kid.Name, new {id ="Name"}
<br/>
@Html.LabelFor(model => model.Kid.Teacher)
@Html.DropDownListFor(model => model.SelectedTeacherId, Model.Teachers)
</form>
表单被提交,在控制器中我得到了填充的 AddNewKidViewDTO 模型:
[HttpPost]
public ActionResult SaveNewKid (AddNewKidViewDTO addNewKidViewDTO)
{
if (ModelState.IsValid)
{
//here is where the problem comes
}
}
在我的情况下,ModelState.IsValid 将始终返回 false。 因为当它开始验证 AddNewKidViewDTO.Kid 时,Teacher 是必填字段,但在我的 addNewKidViewDTO 模型中它为空。我只有 addNewKidViewDTO.SelectedTeacherId 中包含的必要教师 ID。
我的问题是,在传递给我的内部业务逻辑方法之前验证我的模型的优雅方法是什么?
感谢任何帮助。
【问题讨论】:
-
在您的控制器中,如果您将
addNewKidViewDTO.Kid.Teacher.Id设置为addNewKidViewDTO.SelectedTeacherId的值,是否有效? -
是的,我有这个想法。但是首先使用 EF 代码,我无法分配 Id。我需要分配整个教师对象。所以它应该像(忽略语法) addNewKidViewDTO.Kid.Teacher = getTecherById(addNewKidDTO.SelectedTeacherId);我试过了,但没用,不知道为什么。
标签: asp.net-mvc entity-framework ef-code-first asp.net-mvc-5 modelstate