0

我是 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 => model.Teaching 而不是 model.Teaching.Id 但是一个 Teaching 条目被传递给 PostData 我猜他不知道如何将纯 int 转换为一个对象。

任何帮助表示赞赏,感谢您的阅读并提前感谢!

4

1 回答 1

0

好的,所以我在 Create() 函数中传递的模型实际上包含了 Teaching.Id,但似乎 EF 无法将它映射到好的外键或其他任何东西。

我通过在 POST Create 控制器中使用此解决方案使其工作:

 model.Teaching = teachingRepo.Find(model.Teaching.Id);

注意到这不起作用:

 model.Teaching = new Teaching() { Id = model.Teaching.Id }

(如果有人对此有解释,我不反对)

于 2012-10-26T09:00:46.797 回答