2016-04-04 29 views
2

子ビューモデル(ChildViewModelと呼んでいます)のリストを持つ親ビューモデル(ParentViewModelと呼んでいます)があります。それぞれの子ビューモデルは独立して編集でき、私はループで表示する別々のフォームを持っています。これはうまくいきますが、子モデルだけを投稿して親を無視する仕組みはできません。MVCコントローラへの子モデルの投稿

これは私のフォームです:...

@model ParentViewModel 

@foreach (var child in Model.Children) 
{ 
    @using (Html.BeginForm("_EditChild", "Admin", FormMethod.Post)) 
    { 
     @Html.AntiForgeryToken() 
     <div class="form-group"> 
      @Html.EditorFor(model => child.Content, new {htmlAttributes = new {@class = "form-control"}}) 
      @Html.ValidationMessageFor(model => child.Content, "", new {@class = "text-danger"}) 
     </div> 
     <div class="form-group"> 
      <div class="col-md-12"> 
       <input type="submit" value="Create" class="btn btn-default new-post" /> 
      </div> 
     </div> 
    } 
} 

そして、これは私のコントローラの署名です。 ParentViewModelに存在するChildViewModel型をリストとして期待しています。

[Authorize] 
[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult _EditPost([Bind(Include = "")] ChildViewModel childViewModel) 
{ 

} 

フォームは機能し、サブミットしますが、サブミットモデルはサブミットコントローラに到達するとnullになります。これはフォームポストとアクションの間のバインディングが起こっていないためです。

+1

BeginFormコールで_EditChildとは何ですか? – skalinkin

+0

@利用率が高くなることがありますか? * @ using ... @ foreach ... ** –

+0

まず、foreachループ内でフォームコントロールを生成することはできません([この回答](http://stackoverflow.com/questions/30094047/html-table-to説明は、-ado-net-datatable/30094943#30094943を参照してください)。しかし、一度に1つのフォームのみをポストバックすることができるので、各アイテムのフォームが意味をなさないことがあります。すべての変更を1つのフォームで生成して、すべての変更を一度に編集およびポストバックするか、別のページへのリンクを提供して子アイテムを編集することができます。 –

答えて

2

あなたが定義した親モデルである唯一のモデルをページで定義できるため、子モデルを投稿することはできません。

しかし、親モデルをポストし、コントローラ内の子モデルを抽出するだけで問題を解決できます。

0

ASP.NET MVCではありません。あなたがしなければならないのは、クライアント側で提出された入力の名前から親プレフィックスを削除することだけです。

<input name="SomeProperty" ../> 

とモデルバインダーべき:あなたのAdminController._EditChildアクションがChildViewModelを想定している場合、その後、あなただけへの入力の名前を変更するためにJavaScriptを使用する必要があると思います

<input name="Children[0].SomeProperty" ../> 

:あなたの入力は、おそらくのようになります。 ChildViewModelを構築します。代わりに、入力値を変更するよりも醜いハックのように見えるかもしれませんが、誤った接頭辞を持っていても、ChildViewModelに入力をマップするカスタムValueProviderまたはModelBinderを作成することによって、解決することもできます。そのメモでは、名前だけをバインドに使用していても、名前を同期させるために名前を更新するときに、IDをjavascriptで更新することもあります。また

注意、あなたがループしていないが、単にあなたのモデルの単一の子供のViewModelを提出したい、あなただけの変数に割り当てることができた場合:

@var childVM = Model.ChildProp; 
@Html.HiddenFor(m => childVM.ID) 

お知らせmは、プロパティ式では無視されますHiddenForです。

public ActionResult SomeAction(ChildViewModel childVM){ ... } 

私は現在why this technique can't be combined with loopingを理解しようとしている:私は私がした最後の時間は、この変数名は、あなたがにこれを提出するように、アクションのパラメータ名と一致しなければならなかったと思います。

関連する問題