BeginCollectionItem() を持つ PartialView にリストを渡したい。ここにコードがあります、
InquiryOrderViewModel
public class InquiryOrderViewModel
{
public InquiryOrder InquiryOrder { get; set; }
public List<InquiryOrderDetail> InquiryOrderDetails { get; set; }
public List<InquiryComponentDetail> InquiryComponentDetails { get; set; }
}
InquiryComponentDetail
モデル
public class InquiryComponentDetail
{
[Key]
public int InquiryComponentDetailId { get; set; }
public int DesignCodeId { get; set; }
public int QualityReferenceId { get; set; }
public int Height { get; set; }
public int Length { get; set; }
public int GscmComp { get; set; }
public int Wastage { get; set; }
public int TotalYarn { get; set; }
public virtual DesignCodeQltyRef DesignCodeQltyRef { get; set; }
}
InquiryOrderIndex
一度に複数のアイテムをレンダリングするビューとスクリプト
@model eKnittingData.InquiryOrderViewModel
@using (Html.BeginForm("Save", "InquiryOrder"))
{
..........
<div id="cmpDts">
@foreach (var item in Model.InquiryComponentDetails)
{
}
</div>
..........
}
<script>
var prev;
$(document).on('focus', '.class03', function () {
prev = $(this).val();
}).on('change', '.class03', function () {
if (prev != "") {
$.ajax({
url: '@Url.Action("ComponentDts", "InquiryOrder")', // dont hard code your url's
type: "GET",
data: { DesignCdId: $(this).val() }, // pass the selected value
success: function (data) {
$('.cmpCls').last().replaceWith(data);
}
});
}
else {
$.ajax({
url: '@Url.Action("ComponentDts", "InquiryOrder")', // dont hard code your url's
type: "GET",
data: { DesignCdId: $(this).val() }, // pass the selected value
success: function (data) {
$(".class03 option[value='']").remove();
$('#cmpDts').append(data);
}
});
}
});
</script>
_DetailEditorRow
追加されたメインビューでddlsを提供するPartialView 。class03
(これは、何が何であるかを示すためのものですclass03
)
@model eKnittingData.InquiryOrderDetail
@using eKnitting.Helpers
@using (Html.BeginCollectionItem("InquiryOrderDetails"))
{
<div class="editorRow">
@Html.DropDownListFor(a => a.ComponentId, (SelectList)ViewBag.CompList, "Select", new { Class = "class02" })
@Html.DropDownListFor(a => a.DesignCodeId, (SelectList)ViewBag.DCodeList, "Select", new { Class = "class03" })
@Html.TextBoxFor(a => a.NoOfParts, new { Class = "class01" })
<a href="#" class="deleteRow">delete</a>
</div>
}
and in main view it got appended to
<div id="editorRows">
@foreach (var item in Model.InquiryOrderDetails)
{
Html.RenderPartial("_DetailEditorRow", item);
}
</div>
_ComponentDetails
アイテムをレンダリングするPartialView(一度にリストが渡されました)
@model List<eKnittingData.InquiryComponentDetail>
@using eKnitting.Helpers
<div class="cmpCls">
@foreach(var icd in Model)
{
using (Html.BeginCollectionItem("InquiryComponentDetails"))
{
<div class="innerCmpCls">
@Html.DisplayFor(a => icd.DesignCodeId)
@Html.DisplayFor(a => icd.QualityReferenceId)
@Html.TextBoxFor(a => icd.Height, new { Class="clsHeight clsSameHL"})
@Html.TextBoxFor(a => icd.Length, new { Class = "clsLength clsSameHL" })
@Html.TextBoxFor(a => icd.GscmComp, new { Class = "clsGscmComp clsSameHL" })
@Html.TextBoxFor(A => icd.Wastage, new { Class = "clsWastage" })
@Html.ActionLink("Fds", "View", new { id = icd.QualityReferenceId }, new { @class = "myLink", data_id = icd.QualityReferenceId })
@Html.TextBoxFor(a => icd.TotalYarn, new { Class = "clsTotalYarn" })
<br>
<div class="popFds"></div>
</div>
}
}
</div>
リストをまとめて渡してPartialViewを返すActionResult
public ActionResult ComponentDts(int DesignCdId)
{
var objContext = new KnittingdbContext();
var QltyRefList = objContext.DesignCodeQltyRefs.Where(a=>a.DesignCodeId==DesignCdId).ToList();
var iocdList = new List<InquiryComponentDetail>();
foreach(DesignCodeQltyRef dcqr in QltyRefList)
{
iocdList.Add(new InquiryComponentDetail {
DesignCodeId=dcqr.DesignCodeId,
QualityReferenceId=dcqr.QltyRefId
});
}
return PartialView("_ComponentDetails", iocdList);
}
のアクション結果GET
var objContext = new KnittingdbContext();
var newIovm = new InquiryOrderViewModel();
var newIo = new InquiryOrder();
var iocdL = new List<InquiryComponentDetail>();
newIovm.InquiryOrder = newIo;
newIovm.InquiryComponentDetails = iocdL;
return View(newIovm);
のアクション結果POST
public ActionResult Save(InquiryOrderViewModel inquiryOrderViewModel)
{
.........
}
ユーザーが dropdownlist( ) からアイテムを選択するclass03
と、そのアイテムに関連するアイテムが PartialView( _ComponentDetails'
) を使用してビューにレンダリングされ、追加されます。次に、ユーザーが別の ddl( ) から別のアイテムを選択するclass03
と、関連するアイテムがレンダリングされ、以前に追加されたアイテムの後に追加されます。ユーザーはこのように続けることができます。
アイテムのレンダリングと追加は正常に機能します。しかし、ポストバックの場合、リスト内のアイテムの数を正しく取得しても( POST
ActionResult にブレークポイントを配置してチェックしました)、すべてのアイテムのコンテンツが null 値を示します。これを達成するための正しい方法を教えてください。すべての助けに感謝します。ありがとう!