2011-12-28 167 views
0

我花了最近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,NameDescription正確綁定。 但是,即使數據庫中的隱藏字段包含有效的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); 
} 

回答

0

使用id屬性本身:

@Html.HiddenFor(evt => evt.Style.Id) 

編輯

一些需要注意的是,@html.[InputType]For()輔助的方法有哪些要在標記中的元素上設置適當的名稱/標識屬性,以便在發佈時默認模型聯編程序將知道如何設置模型上的屬性。

如果你看的HTML標記,你會看到你的風格元素創建這樣的:

<input id="Style_Id" type="hidden" value="" name="Style.Id" /> 

這是命名約定,默認的模型綁定理解和它用來設置的屬性你的模型。

+0

呵呵我忽略了,它似乎在工作,謝謝! 雖然,它不會從數據庫中加載Id。我必須通過'event.Style.Id'手動執行此操作嗎? – Jorticus 2011-12-28 12:20:16

+0

@Jorticus默認的modelbinder不具備數據庫的知識,它的目的是簡單地在你的模型中設置在Params中找到的屬性。不建議給你的模型綁定器數據庫知識。 – Craig 2011-12-28 12:25:26

0

隱藏字段只能存儲標量值。你的EventStyle類是複雜的,由2個屬性組成。所以,你需要2個隱藏字段爲每個2個屬性:

@Html.HiddenFor(evt => evt.Style.Id) 
@Html.HiddenFor(evt => evt.Style.Image) 
+0

謝謝!剛纔在下面看到了同樣的事情。 Image屬性實際上將從數據庫中提取,我有一個單獨的編輯器來編輯EventStyles。 – Jorticus 2011-12-28 12:21:27

0

您在Event Model Class中缺少EventStyle屬性,使其成爲該模型的外鍵。

只需將其添加到您的Event模型類,你應該沒問題。

public int EventStyleId { get;set; }