2017-11-29 6 views
0

私はこれについて多くの研究を行ってきましたが、半分の成功しかありませんでした。 私の問題はこれです:問題は私のViewModelのプロパティは、以下のいずれか見たオブジェクトのリストであるということです、私はビューモデルとASP.NET MVCのビューを持っている :投稿にBeginCollectionItemを使用して、オブジェクトのコレクションをコントローラに投稿するにはどうすればよいですか?

public string ApplicationNo { get; set; } 

    public int HSCode { get; set; } 

    public IEnumerable<HSCode> HSCodes { get; set; } 

    public string ItemDescription { get; set; } 

    public int Weight { get; set; } 

    public QuantityUnit Quantity { get; set; }   

    public int Cost { get; set; } 

    public List<Item> Items { get; set; } 

public class Item 
    { 
     public int HSCode { get; set; } 
     public string ItemDescription { get; set; } 
     public int Quantity { get; set; } 
     public int Weight { get; set; } 
     public double Cost { get; set; } 
    } 

私は新しいアイテムをレンダリングしています部分ビューとajaxを使用してユーザーに通知します。 部分ビュー:

@model ecims.ViewModels.NewApplicationViewModel 

<table id="myTableData" class="table" cellpadding="2"> 
    @using (Html.BeginCollectionItem("newRow")) 
    { 
     if (Model.Items.Count != 0) 
     { 
      <tr> 
       <th> 
        @Html.DisplayNameFor(model => @Model.HSCode) 
       </th> 
       <td> 
        @Html.EditorFor(model => @Model.Items.FirstOrDefault().HSCode, new { htmlAttributes = new { @class = "form-control", @value = @Model.Items.FirstOrDefault().HSCode.ToString() } }) 
       </td>    
       <th> 
        @Html.DisplayNameFor(model => @Model.Quantity) 
       </th> 
       <td> 
        @Html.EditorFor(model => @Model.Items.FirstOrDefault().Quantity, new { htmlAttributes = new { @class = "form-control", @value = @Model.Items.FirstOrDefault().Quantity.ToString() } }) 
       </td> 
       <th> 
        @Html.DisplayNameFor(model => @Model.ItemDescription) 
       </th> 
       <td> 
        @Html.EditorFor(model => @Model.Items.FirstOrDefault().ItemDescription, "Item Description", new { htmlAttributes = new { @class = "form-control", @value = @Model.Items.FirstOrDefault().ItemDescription.ToString() } }) 
       </td> 
       <th> 
        @Html.DisplayNameFor(model => @Model.Cost) 
       </th> 
       <td> 
        @Html.EditorFor(model => @Model.Items.FirstOrDefault().Cost, new { htmlAttributes = new { @class = "form-control", @value = @Model.Items.FirstOrDefault().Cost.ToString() } }) 
       </td> 
      </tr> 
     } 
     else 
     { 
      <tr> 
       <th> 
        @Html.EditorFor(model => @Model.HSCode, new { htmlAttributes = new { @class = "form-control", @value = "" } }) 
       </th> 
       <td> 
        @Html.EditorFor(model => @Model.HSCode, new { htmlAttributes = new { @class = "form-control", @value = "" } }) 
       </td> 
      </tr> 
     } 
    } 
</table> 

私のAJAX機能がここにある:ユーザーが「追加」をクリックしたときに

<script type="text/javascript"> 


     $("#add").on('click', function() { 

      var HSCode = $('#hsCode').val(); 
      var ItemDescription = $('#descrip').val(); 
      var Quantity = $('#qty').val(); 
      var QuantityUnit = $('#qtyUnit').val(); 
      var Cost = $('#cost').val(); 

      $.ajax({ 
       async: false, 
       data: { 'HSCode': HSCode, 'Quantity': Quantity, 'ItemDescription': ItemDescription, 'QuantityUnit': QuantityUnit, 'Cost': Cost }, 
       url: '/CreateEUCApplication/CreateNewEUCItem', 
       success: function (partialView) { 
        $('#newRow').append(partialView); 
       } 
      }); 
     }); 

</script> 

私は新しいエントリで更新されるのViewModelに「項目」リストをしたいと思いますボタン。現在、私のajaxメソッドは、新しい項目でビューを正常に更新しますが、コントローラにポストすると、 'Model.Item'リストは空であり、例外がスローされます。

ViewModelのリストを自分のコントローラに投稿して処理するにはどうすればよいですか? ありがとうございます。 PS:私のコードを改善するための編集/提案は歓迎されたものではありません(私は初心者です:-))

+0

コードは意味がありません。 [この回答](http://stackoverflow.com/questions/40539321/partial-view-passing-a-collection-using-the-html-begincollectionitem-helper/40541892#40541892)をご覧ください。 (フォームコントロールを生成するために 'HtmlHelper'メソッドを使用するときは、' value'属性を設定することは一切ありません) –

+0

あなたの提案をお寄せいただきありがとうございます。私は今、あなたの解決策に取り組んでいます。それがどのように更新されるのかを掲載します。 –

+0

こんにちは@StephenMuecke、私はあなたが提案し、私のビューモデル、ビュー、コントローラを投稿したソリューションに合うように編集した投稿を見てきました。問題は今、追加ボタンをクリックすると、期待どおりに新しい行が作成されますが、すべての値はフォームの値ではなく0に設定されていることです。ビューには、HSCode、Weightなどのドロップダウンリストとテキストボックスがあります。これらの値は、ユーザーが追加をクリックしたときに部分ビューに保持されているものになります。私はItemオブジェクトのリストを持っていて、ビューモデルのリストを保持しているので、ビューモデルの設計が投稿したものとは異なることに気付きました。 –

答えて

0

開始するには、@をHtml内で使用する必要はありませんヘルパーメソッド;変更:

@Html.DisplayNameFor(model => @Model.HSCode) 

オンラインBeginCollectionItemを使用してのいくつかの例があります

@Html.DisplayNameFor(model => Model.HSCode) 

へ: MVC 5 Dynamic Rows with BeginCollectionItem

あなたはHtml.BeginCollectionItemを使用する必要はありません。 on my blog there is another option、もう少し複雑な設定です。私のソリューションは剣道UIを使用していますが、これは必須条件ではありません。

関連する問題