将视图发送的表单数据映射到为其设计的模型类时,我遇到了问题。
我有一个老师模型:
public class Teacher : Person
{
[Required]
[StringLength(50)]
public String Title { get; set; }
[Required]
public DateTime DateOfApproval { get; set; }
public ICollection<ThesisApplication> ManagerOf { get; set; }
}
和ThesisApplication模型(学生填写的申请表,上面他说谁想成为他的经理)。
public class ThesisApplication
{
public int Id { get; set; }
public virtual Thesis Thesis { get; set; }
[ForeignKey("Manager")]
public virtual int ManagerId { get; set; }
public virtual Teacher Manager { get; set; }
//other properties that doesn't matter here
}
和流利的API之间的连接
modelBuilder.Entity<ThesisApplication>()
.HasRequired( s => s.Manager ).WithMany(s => s.ManagerOf );
在我的表格中,我有:
@Html.DropDownListFor( x => x.ManagerId, (IEnumerable<SelectListItem>)( ViewBag.People ) )
在哪里
ViewBag.People = new SelectList(this.databaseEntities.Teachers.All(), "PersonId", "FirstName");
但是当我像这样将表单传递给控制器中的create方法时
[HttpPost]
public ActionResult Create( ThesisApplication application )
{ ...
我得到了正确的managerId,但Manager属性为空(null)。尝试获取Manager的属性时,将引发异常。
有人可以解释为什么会这样。我对不使用外键的解决方案感兴趣。像DropDownFor(x => x.Manager)之类的内容可以在不使用外键的情况下映射Manager属性。
谢谢:)
您从表单发布中看到的对象是一个普通对象,由MVC模型绑定器实例化在Entity Framework外部。如果要获取Teacher
要表示的对象,则必须使用DbSet.Find方法(或中的任何其他方法DbSet<Teacher>
):
[HttpPost]
public ActionResult Create(ThesisApplication application )
{
using(var context = new TeacherContext()) //or whatever/however you access your DbContext
{
var teacher = context.Teachers.Find(application.ManagerId);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句