我花了最近2天試圖弄清楚,基本上我有兩個模型(Event和EventStyle),但是EventStyle一個不會綁定,不管我嘗試什麼。MVC3模型綁定外鍵
這些類是Code-First數據庫的一部分,而Event模型具有EventStyle的外鍵。
這裏是我的淡化型號:
public class Event {
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual EventStyle Style { get; set; }
}
public class EventStyle {
public string Id { get; set; }
public string Image { get; set; }
}
在我的控制器我有這樣的:
[HttpPost]
public ActionResult Create(Event evt) { /* add evt to the database */ }
和一個簡單的形式:
@using (Html.BeginForm()) {
@Html.HiddenFor(evt => evt.Id)
@Html.HiddenFor(evt => evt.Style)
@Html.TextBoxFor(evt => evt.Name)
@Html.TextAreaFor(evt => evt.Description)
}
(其實我有一個custom @ Html.EditorFor for evt.Style它改變了隱藏字段的值)
表單提交時,事件與Id
,Name
和Description
正確綁定。 但是,即使數據庫中的隱藏字段包含有效的EventStyle
ID,Style
屬性仍爲空。
如果我刪除的隱藏字段,然後風格成爲默認的一個(如事件的構造函數中設置)
我也嘗試使用上EventStyle一個ModelBinder
,但正確的ID還沒有出現過bindingContext
,這可能是問題的一部分。
但是,正確的ID確實通過控制器中的活頁夾controllerContext
或直接使用FormCollection
。我寧願讓ModelBinding正常工作。
也許ModelBinder對我的數據庫沒有任何認識?如果是這樣,我怎麼才能讓它識別我的數據庫?
編輯:嗯只是刪除了virtual
現在的活頁夾從形式拿起正確的ID,但它仍然沒有得到對事件模型的
EDIT2:解決,以此來加載從該EventStyle數據庫:
if (evt.Style != null) {
evt.Style = db.EventStyles.Find(evt.Style.Id);
}
呵呵我忽略了,它似乎在工作,謝謝! 雖然,它不會從數據庫中加載Id。我必須通過'event.Style.Id'手動執行此操作嗎? – Jorticus 2011-12-28 12:20:16
@Jorticus默認的modelbinder不具備數據庫的知識,它的目的是簡單地在你的模型中設置在Params中找到的屬性。不建議給你的模型綁定器數據庫知識。 – Craig 2011-12-28 12:25:26