私はこの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);
}
私はそれを見落とした、それは働いているようだ、感謝! ただし、IDはデータベースからロードされません。 'event.Style.Id'を通して手動でこれを行う必要がありますか? – Jorticus
@ Jorticusデフォルトのmodelbinderはデータベースの知識がないので、Paramsにあるモデルのプロパティを設定するだけです。モデルバインダーデータベースの知識を与えることはお勧めしません。 – Craig