2016-09-14 6 views
0

これは私に困惑しているものです。このための方法が組み込まれているのだろうかと思います。ASP.NETフォームは、モデルの一部として送信します

あなたは

public class Package 
{ 
    public A AObject { get; set; } 
    public B BObject { get; set; } 
} 

Packageクラスがあり、このPackageを使用するビューを持っていると言います。

public ActionResult Action() 
{ 
    return View(new Package()); 
} 

ビューはこのモデルを受け入れ、2つのフォームを持ちます。

@model Path.To.Package 

@Html.BeginForm("SubmitA", "MyController") 
{ 
    @Html.TextBoxFor(m => m.AObject.SomeProperty); 
    <input type="submit" /> 
} 
@Html.BeginForm("SubmitB", "MyController") 
{ 
    @Html.TextBoxFor(m => m.BObject.AnotherProperty); 
    <input type="submit" /> 
} 

を1は、この質問せずに動作します、引数としてPackageを取る上で必要な2つのアクションを作成した場合は...

public JsonResult SubmitA(Package items) { ... } 
public JsonResult SubmitB(Package items) { ... } 

しかしSubmitAでBObjectはnullになり、SubmitBにAObjectは次のようになりヌル。

私の質問は、モデルの一部だけを送信できるかどうかです。だから、最初の形式はだけなので、あなたが実際に次のアクションを経由してこれらに達する可能性があるAObjectと第二BObjectを提出する:

public JsonResult SubmitA (A a) { ... } 
public JsonResult SubmitB (B b) { ... } 
+1

なぜ2つのフォームがありますか?フォームは1つしか送信できません。しかし、はい、 'BindAttribute'の' Prefix'プロパティを使うことができます - 'public JsonResult SubmitA([Bind(Prefix =" AObject ")] A){...}' –

+0

@StephenMuecke 2つのフォームのシナリオはちょっと長いですが、はい、1つのフォームを(一度に)提出する必要がありますが、そのフォームで呼び出すアクションに適切なタイプ/オブジェクトを渡すだけです(私は理にかなっている)。それ以外の場合は、プレフィックスのものと思っています!あなたは答えの下に投稿することができます、いくつかの点を得る:) – NemanjaT

+1

@ NemanjaTあなたの場合でも、それは提出されたモデルの一部です。送信されたフォームデータには、送信されたフォームフィールドに対応する値しかありません。 – sachin

答えて

1

あなたは、モデルの複雑なプロパティにバインドするBindAttributePrefixプロパティを使用することができます。この属性は、モデルにバインドするときに、提出された名前/値のペアから接頭辞を効果的に削除します。

お使いのコントローラメソッドは、あなたが本当に各フォームに別々のビューモデルを使用する必要があります

public JsonResult SubmitA([Bind(Prefix = "AObject")]A model) { ... } 
public JsonResult SubmitB([Bind(Prefix = "BObject")]B model) { ... } 
1

だろう。もちろん、バインド属性を使用することもできますし、コントローラアクションで特定のプロパティ名を使用することもできます。しかし、それはあなたの本当の問題を解決しません。いずれかの値のみを取得でき、他のオブジェクトは割り当てられていないかNULLになります。このため、ビュー/フォームごとに個別のビューモデルを用意する必要があります。両方のオブジェクトの値を取得すると、Packageオブジェクトを構築できます。

+0

それは、非常に、良い点です、ありがとう! – NemanjaT