我是ASP.NET的新手,我正在努力实现以下目标:
我正在开发使用MVC4和代码优先的EF方法,我有以下模型:
public class Booking {
// Lot of standard int/string attributes
// And a navigation attribute
public virtual Teaching teaching {get;set;}
}
教学是另一种非常基本的模式。我使用初始化程序引导了我的数据库,一切都很好,EF创建了我的SQL结构并自动将Teaching_Id添加到Booking表中。我的模型也正确填充(我猜是延迟加载),我可以在我的索引视图中打印model.Teaching.name。
我现在正在制作一个创建表单,将新的预订添加到我的数据库中,我希望用户能够从列表中选择一个教学。到目前为止,我设法实现了这一点,我的观点非常标准(自动生成):
<div class="editor-label">
@Html.LabelFor(model => model.BookingDate)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.BookingDate)
@Html.ValidationMessageFor(model => model.BookingDate)
</div>
到目前为止的简单属性。我为选择列表
做了这个在我的控制器中:
var id = (int)Membership.GetUser().ProviderUserKey;
ViewBag.listTeachings = db.Teachings.Where(x => x.Teacher.UserId == id).ToList();
在我看来(在表格内)
@Html.DropDownListFor(model => model.Teaching.Id, new SelectList(ViewBag.listTeachings, "Id", "Id"))
(出于测试目的,我在下拉列表中引用了Id)
当我发布表单时,一切正常(没有模型状态错误)但数据库中没有添加任何内容。在我的表单POST内容中,我有一个Teachings.Id条目。我也尝试使用DropDownListFor model =&gt; model.Teaching而不是model.Teaching.Id但是教学条目传递给PostData,我猜他不知道如何将纯int转换为对象。
感谢任何帮助,感谢您的阅读和感谢提前!
答案 0 :(得分:0)
好的,所以我在Create()函数中传递的模型实际上包含了Teaching.Id,但似乎EF无法将它映射到好的外键或其他任何东西。
我在POST Create控制器中使用此解决方案使其工作:
model.Teaching = teachingRepo.Find(model.Teaching.Id);
注意到这不起作用:
model.Teaching = new Teaching() { Id = model.Teaching.Id }
(如果有人对此有解释我不反对)