2012-04-13 15 views
1

入力モデルを部分ビューからコントローラに渡したいと思います。私はむしろ、MVCの初心者で、デフォルトのモデルバインダーの仕組みを理解しようとしています。部分入力の入力モデルの結合が必要です

経由AJAX(listBox)コントローラは部分ビューを戻し、テーブルid = searchResultsに挿入します。ここで

@model ViewModels.LocationViewModel 
@using (Ajax.BeginForm("ProcessSearch", "SearchR", new AjaxOptions 
{ 
    HttpMethod = "GET", 
    InsertionMode = InsertionMode.Replace, 
    UpdateTargetId = "searchResults", 
})) 

{ 
    <div>@Html.ListBoxFor(xxx)</div> 
    <input id="Search" type="submit" value="Search" /> 
} 

は、部分的なビュー私は私がまだ別のビューモデルにバインドしたい場合は、このフォームを持って同じメインビューで

public class OrderViewModel 
{ 
    public string Description  { get; set; } 
    public string Status   { get; set; }  
} 

public ActionResult ProcessSearch(SearchViewModel search) 
{ 
    select new OrderViewModel{ 
       Status=f.STATUS, 
       Description=f.DESCRIPTION}).ToList(); 
    return PartialView(model); 
} 

を移入コントローラとViewModelにあります。私は部分ビューのモデルからデフォルトのバインダーを実装する方法を理解していないだけです。私はこれを正しく説明しなければ謝罪します。それが理にかなってほしい。

@using (Html.BeginForm("Testing", "SearchR", FormMethod.Post)) 
{ 
    <div>@Html.DropDownListFor(yyy)</div> 
    <input id="Reshop" type="submit" value="Reshop" /> 
} 
<table id="searchResults"></table> 


public ActionResult Testing(RSOrderViewModel rOrder) 
{ 
    return Content("hey"); 
} 

public class RSOrderViewModel 
{ 
    public string yyy { get; set; } 
    public IEnumerable<OrderViewModel> sovm { get; set; } 
} 


@model List<ViewModels.OrderViewModel> 

@{ViewData.TemplateInfo.HtmlFieldPrefix = "sovm"; 
    } 

<table id="searchResults"> 
    <tr> 
     <th>Order Id</th> 
     <th>Order Detail</tr> 

@for (int i = 0; i < Model.Count; i++) 
{ 
    <tr> 
     <td> 
     @Html.DisplayFor(x => x[i].OrderId) 
     </td> 
     <td> 
     @Html.DisplayFor(x => x[i].OrderDetail) 
     </td> 
    </tr> 
} 

</table> 

答えて

3

表は第2の形式外です。だから、TestingアクションにPOSTすると、コントローラに送信されるのはドロップダウンリストの値だけです。あなたがこのテーブルに保存されているコレクションを送信したい場合は、AJAXを使用するか、フォーム内のテーブルを置くのいずれかがあります:

@using (Html.BeginForm("Testing", "SearchR", FormMethod.Post)) 
{ 
    <div>@Html.DropDownListFor(yyy)</div> 
    <table id="searchResults"></table> 
    <input id="Reshop" type="submit" value="Reshop" /> 
} 

今のコースフォーム内のテーブルを置くことは、それがすることを意味するものではありませんフォームを送信すると、サーバーに何かを送信します。 POSTされる値を含む入力フィールド(ユーザーに表示させたくない場合は非表示)を配置する必要があります。また、これらの入力フィールド名は、リストへのバインドのためにstandard conventionに従わなければなりません。

部分ビューの外観は実際にはわかりませんが、ここでは規約が尊重されるように見える方法の例を示します。 ~/Views/Shared/EditorTemplates/OrderViewModel.cshtml

@model IEnumerable<OrderViewModel> 
@{ 
    // We set the name prefix for input fields to "sovm" 
    // because inside your RSOrderViewModel the collection 
    // property you want to bind to this table is called sovm 
    // and in order to respect the convention the input names 
    // must be in the following form "sovm[0].OrderId", "sovm[1].OrderId", ... 
    ViewData.TemplateInfo.HtmlFieldPrefix = "sovm"; 
} 
<thead> 
    <tr> 
     <th>Order Id</th> 
     <th>Order detail</th> 
    </tr> 
</thead> 
<tbody> 
    @Html.EditorForModel() 
</tbody> 

、その後、あなたは、モデルの各要素に対してレンダリングされるエディタテンプレートを持つことができます:OrderIdでとOrderDetail:たとえば、あなたはあなたがバインドしたいあなたOrderViewModelで2つの性質を持っていると仮定してみましょう):

@model OrderViewModel 
<tr> 
    <td>@Html.EditorFor(x => x.OrderId)</td> 
    <td>@Html.EditorFor(x => x.OrderDetail)</td> 
</tr> 

テンプレートの名前は、あなたが(IEnumerable<OrderViewModel> sovm { get; set; } =>OrderViewModel.cshtml)にバインドするコレクションで使用されるタイプの名前です。複数のコントローラ間で再利用できる場合、またはXXXが現在のコントローラである~/Views/XXX/EditorTemplatesフォルダ内の現在のコントローラに固有の場合は、~/Views/Shared/EditorTemplatesフォルダ内に配置する必要があります。

+0

こんにちはダーリン、上記の部分的な見解を加えました。私の限られた理解に基づいて、forループを追加してプレフィックスカウンタを追加しました。それはうまくいきませんでした。なぜなら、私にこの謝り手をする何かを与えるからです。私はエディタテンプレートを使用しませんでした...それは重要ですか?私はテーブルを使うと思った。あなたの助けをもう一度ありがとう – Mustang31

+0

@ Mustang31、あなたが '

'タグがまだフォームの外にあることを示した例では。それがうまくいかない理由です。それ以外のforループを使用するアプローチでは、エディタテンプレートを使用するのと同じマークアップが生成されます。ちょっと面倒です。個人的に私はフレームワークを私のためにこの仕事をしておき、慣習に専ら頼っています。 –

+0

ダーリン、申し訳ありませんが、私は上記の記事のセグメントを更新しませんでしたが、私のコードでは、フォームにテーブルを追加しました。 – Mustang31

関連する問題