2

私はこれらに似たいくつかのビューモデルを持っています:

public class ResturantViewModel
{
   public ResturantViewModel()
   {
       Clients.Add(new ClientViewModel());
   }
   public string MyProperty {get;set;}
   public IList<ClientViewModel> Clients = new List<ClientViewModel>();
}

public class ClientViewModel
{
   public string FirstName {get;set;}
   public string LastName {get;set;}
}

私の見解では、次のようなものがあります。

@foreach(var client in Model.Clients)
{
   <tr>
      <td>First Name: @Html.EditorFor(item => client.FirstName)</td>
      <td>Last  Name: @Html.EditorFor(item => client.LastName)</td>
   </tr>
}

View でレンダリングして Resturant/Create アクションに投稿できるように、いくつかの新しい空の ClientViewModels を ResturantViewModel.Clients リストに追加できるボタンが必要です。

前もって感謝します

4

3 に答える 3

1

次のブログ投稿をご覧ください。WebForms ビュー エンジンを使用しますが、Razor に非常に簡単に適応させることができます。

于 2011-12-13T15:24:35.210 に答える
1

ビュー内にオブジェクトのリストを実装する必要があります

  <input type="text" name='Clients[@index].FirstName' value='@c.FirstName' />
  <input type="text" name='Clients[@index].LastName'  value='@c.LastName' /> 

@index++;

その後、これらのフィールドを次のインデックス値で複製する必要があるため、次のような入力を取得する必要があります。

 <input type="text" name='Clients[0].FirstName' value='@c.FirstName' />
 <input type="text" name='Clients[0].LastName'  value='@c.LastName' /> 

 <input type="text" name='Clients[1].FirstName' value='@c.FirstName' />
 <input type="text" name='Clients[1].LastName'  value='@c.LastName' /> 
 <input type="text" name='Clients[2].FirstName' value='@c.FirstName' />
 <input type="text" name='Clients[2].LastName'  value='@c.LastName' /> 

コントローラーでは、これらのオブジェクトのリストを受け入れます。

List<Client> Clients
于 2011-12-13T15:29:27.750 に答える
0

ここで私が解決するために行ったことです。

最初に、新しい部分ビュー _ClientRow.cshtml を作成しました。

@using Extensions.CollectionItemsHtmlExtension
@using ClientViewModel
@model ClientViewModel
<div class = "clientEditRow">
   @using(Html.BeginCollectionItem("Clients"))
   {
      @First Name: @Html.TextBoxFor(c=>c.FirstName)
      @Last Name: @Html.TextBoxFor(c=>c.LastName)
   }
</div>

この部分的なビューは、クライアントの新しい行をレンダリングします。BeginCollectionItem は、Darin が言及したブログ投稿に従ってダウンロードされた Html 拡張機能です。

次に、私の見解では、次のように設定しました。

<legend>Clients</legend>
<fieldset>
    <div id="clientEditorRows">
        @foreach(var client in Model.Clients)
        {
           Html.RenderPartial("_ClientRow", client);
        }
    </div>
    @Html.ActionLink("New Client", "NewClientRow", null, new {id = "addItem"})
</fieldset>
...
<script type="text/javascript" scr="../Scripts/listEditor.js"></script>

foreach はすべてのクライアントをループし、すべてのクライアントの部分ビューをレンダリングします。次に、コントローラーで次のメソッドを作成しました。

public PartialViewResult NewClientRow()
{
   return PartialView("_ClientRow", new ClientViewModel())
}

このメソッドは ActionLink によって呼び出され、前の行に追加された新しい行の html を返します。最終的に、ブログ投稿からこの JavaScript ファイル コードを追加し、自分のケースに合わせて変更しました。

listEditor.js

$("#addItem").click(function () {
    $.ajax({
        url: this.href,
        cache: false,
        success: function (html) { $("#clientEditorRows").append(html); }
    });
    return false;
});

この js コードは、新しい行の html をページに追加します。これがお役に立てば幸いです。ありがとうございました。

アレックス

PS: 値を受け取る HttpPost メソッドは変更されておらず、このシグネチャを持っています

[HttpPost]
public ActionResult Create(ResturantViewModel resturantVM)
{
   ...
}

resturantVM.Clients がすべての値を受け取ることに注意してください。IList Clients パラメータを追加する必要はありません。

于 2011-12-23T19:27:01.803 に答える