2011-12-28 13 views
0

私はこの2つのモデルを(EventとEventStyle)持っていますが、私が試したことに関係なくEventStyleはバインドしません。MVC3モデルの外部キーとのバインド

これらのクラスは、コードデータベースのコードの一部であり、イベントモデルにはEventStyleの外部キーがあります。

[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) 
} 

(私が実際に持っている私はこれを持って私のコントローラで

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; } 
} 

:ここ

は私の水で薄めたモデルです非表示フィールドの値を変更するevt.Styleのcustom @ Html.EditorFor)

フォームが提出されると、イベントはId,NameおよびDescriptionに正しくバインドされます。 ただし、隠しフィールドに有効なEventStyle IDがデータベースに含まれていても、Styleプロパティはnullのままです。

私は隠しフィールドを削除する場合は、スタイルがデフォルト1になり(イベントのコンストラクタで設定)

私もEventStyleにModelBinderを使用してみましたが、正しいIDがbindingContext伝わってくることはありません、これはあるかもしれません問題の一部

ただし、正しいIDはバインダーcontrollerContextを経由するか、コントローラのFormCollectionを直接使用します。私はむしろModelBindingを正しく動作させることが大事です。

多分、ModelBinderは私のデータベースの知識がありませんか?もしそうなら、どのように私のデータベースを認識させることができますか?

EDIT:解決、からEventStyleをロードするためにこれを使用して:うーんちょうどバインダーは、フォームから正しいIDを拾っているが、それはまだイベントモデルに

EDIT2を取得していない今virtualを削除し、データベース:

if (evt.Style != null) { 
    evt.Style = db.EventStyles.Find(evt.Style.Id); 
} 

答えて

0

はIdプロパティ自体を使用します。

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

編集

を注意するために何かが@html.[InputType]For()ヘルパーメソッドがあるということですマークアップの要素に適切なname/id属性を設定して、投稿時にデフォルトのモデルバインダーがモデルのプロパティを設定する方法を知るようにします。

あなたは、HTMLマークアップを見れば、あなたのスタイル要素は、このように作成されて表示されます。

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

これはデフォルトのモデルバインダーを理解し、それが上のプロパティを設定するために使用するもの命名規則でありますあなたのモデル。

+0

私はそれを見落とした、それは働いているようだ、感謝! ただし、IDはデータベースからロードされません。 'event.Style.Id'を通して手動でこれを行う必要がありますか? – Jorticus

+0

@ Jorticusデフォルトのmodelbinderはデータベースの知識がないので、Paramsにあるモデルのプロパティを設定するだけです。モデルバインダーデータベースの知識を与えることはお勧めしません。 – Craig

0

隠しフィールドにはスカラ値のみを格納できます。 EventStyleクラスは複雑で、2つのプロパティで構成されています。だから、2つのプロパティのそれぞれについて、2つの隠されたフィールドを必要とする:

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

感謝!下の同じものを見ただけです。 Imageプロパティは実際にデータベースから取得されますが、EventStylesを編集する別のエディタがあります。 – Jorticus

0

あなたはそれそのモデルの外部キーにするために、あなたのイベントモデルクラスでEventStyleプロパティが欠落しています。

ちょうどあなたのEventモデルクラスにこれを追加して、あなたは問題ないはずです。

public int EventStyleId { get;set; } 
関連する問題