2012-01-13 17 views
2

をコントローラに投稿するとき、あなたが見ることができるように、私は(下図参照)次モデルMVC3モデルの代わりにモデルが...

public class Order 
    { 
     //[Key] 
     [ScaffoldColumn(false)] 
     public int OrderId { get; set; } 

     [DisplayName("Order Date")] 
     public DateTime OrderDate { get; set; } 

     public virtual ProductSelection ProductSelection { get; set; } 

     public virtual ShippingDetails ShippingDetails { get; set; } 

     public virtual BillingDetails BillingDetails { get; set; } 

     public virtual CardDetails CardDetails { get; set; } 

     public virtual AccountUser AccountUsers { get; set; } 
    } 

を持って見ることができない例ProductSelectionのための他のモデルのセットで構成されて(下に示された)。

public class ProductSelection 
    { 
     public int SimulatorId { get; set; } 

     public string VersionNumber { get; set; } 

     [DisplayName("Quantity")] 
     public int Quantity { get; set; } 

     [DisplayName("Total Price")] 
     [ScaffoldColumn(false)] 
     public decimal TotalPrice { get; set; } 
    } 

Iが午前問題は、私が注文のパラメータを有するコントローラに投稿するとき、私は、サブモデルからのいずれかの値を得ることができません(例えばOrder.ProductSelection.SimulatorId)。

私は現在、理想的ではなく、より面倒ではないFormCollectionを使用しなければならないので、これが機能しない理由はありません。回答を楽しみに

を探し

スティーブ

+0

愚かな質問かもしれませんが、あなたの子オブジェクトはなぜ「仮想」とマークされていますか? – tobias86

+0

公開されているかどうかわかりませんか? – swade1987

+0

たぶんそれらを 'public'にしようとします。 ModelBinderがあなたの投稿されたデータをActionの議論にどのように結びつけているかに影響を与えていると言いながら、私はここで足を引っ張っているかもしれません。 – tobias86

答えて

0

あなたはProductSelectionクラスの主キーポイントProductSelection性質上ForeignAttributeを適用する必要があります:

[ForeignKey("SimulatorId")] 
public virtual ProductSelection ProductSelection { get; set; } 

役に立てば幸いです。

+0

ForeignKeyAttributeをRequiredAttributeに置き換えることができます。これは、必要に応じて関係をマークし、データベースにON DELETE CASCADEを生成します。 –

+0

私は今これを試してみます:) – swade1987

+0

SimulatorId属性は各サブモデルにあり、Order内の各モデルでForeignKeyを使用しますか? – swade1987

1

1)愚かな質問ですが、確かに....あなたのサブモデルの値をビューに保存していますか?(隠しやその他の入力タイプの形式で、あなたの隠された名前がモデル内のプロパティ名)またはクエリ文字列内に指定します。 完全にロードされたモデルを提供する前に、モデルバインダーは、フォームコレクション、経路データ、およびクエリ文字列のようなモデルをロードするための別の場所を調べます これらの場所のいずれにも保存しない場合、モデルバインダーは、コントローラーのアクションにロードされた値を与えます。
基本.. http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx

2)あなたのモデル例は罰金だが、あなたのサブモデルのすべてのプロパティがパブリックアクセス修飾子を持っているし、彼らは彼らのプロパティ宣言で設定されていなければならないことを確認してください。 --->私は前に同じ問題を抱えていました。私はこれらのプロパティにプライベートアクセス修飾子を設定していました。

3)何も動作しない場合(希望でない場合があります)、最後に独自のモデルバインダーを作成できます。ここ は、あなたがその方向に http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/

を頭に決める場合、これは(私のアカウントで)私の最初のポストであり、それは参加して本当に良い感じ良いポストです..!

+0

もう1つのリンク.. http://forums.asp.net/p/1559541/3846605.aspx(愚かな..だから私は2つ以上のリンクを追加できませんでした) –

+0

こんにちはAmit、 多く詳細な返信をありがとう。 ビューについてJQueryアコーディオンで作成されたOrder \ Index.cshtmlファイルがあり、各セクションには部分的なビュー(ProductSelectionなどの特定のサブモデルで構成されています) すべての値を保存する必要がありますサブモデルの)をOrder \ Index.cshtmlファイルの隠しフィールドとして使用すると、Order.ProductSelection.Quantityを使用してコントローラでアクセスできます。 – swade1987

+0

必ずしもすべての値をIndex.cshtmlに保存する必要はありません。部分モデルでサブモデルを渡している場合は、部分モデルで非表示にして、フォーム内で部分的にレンダリングすることができます。この方法では、ビューで読みやすさが向上します。 –

関連する問題