私はこれについて多くの研究を行ってきましたが、半分の成功しかありませんでした。 私の問題はこれです:問題は私の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:私のコードを改善するための編集/提案は歓迎されたものではありません(私は初心者です:-))
コードは意味がありません。 [この回答](http://stackoverflow.com/questions/40539321/partial-view-passing-a-collection-using-the-html-begincollectionitem-helper/40541892#40541892)をご覧ください。 (フォームコントロールを生成するために 'HtmlHelper'メソッドを使用するときは、' value'属性を設定することは一切ありません) –
あなたの提案をお寄せいただきありがとうございます。私は今、あなたの解決策に取り組んでいます。それがどのように更新されるのかを掲載します。 –
こんにちは@StephenMuecke、私はあなたが提案し、私のビューモデル、ビュー、コントローラを投稿したソリューションに合うように編集した投稿を見てきました。問題は今、追加ボタンをクリックすると、期待どおりに新しい行が作成されますが、すべての値はフォームの値ではなく0に設定されていることです。ビューには、HSCode、Weightなどのドロップダウンリストとテキストボックスがあります。これらの値は、ユーザーが追加をクリックしたときに部分ビューに保持されているものになります。私はItemオブジェクトのリストを持っていて、ビューモデルのリストを保持しているので、ビューモデルの設計が投稿したものとは異なることに気付きました。 –