Steve Sanderson의 BeginCollectionItem 도우미를 사용하고 있는데 문제가 발생했습니다. 무제한 보상 필드를 추가 할 수있는 양식이 있습니다. 필드를 생성하는 방법을 계속 유지하면서 양식을 제출할 때이를 바인딩하는 방법에 대해 걱정할 필요가없는이 문제를 해결 한 이후로 도우미를 사용하고 있습니다.Steve Sanderson의 BeginCollectionItem 도우미가 올바르게 바인딩되지 않습니다.
이 양식에는 알 수없는 금액이있는 체크 박스가 있습니다. 보상과의 차이점은 데이터베이스 호출 후에 알 수없는 양이 알려지고 코드가 뷰에 도달 할 때 알 수 있다는 점입니다.
그래서 내 코드는 내가 serializeArray를 사용하여 데이터를 전송하기 위해 jQuery를 사용하고이
public class FrmVm
{
public Guid Id { get; set; }
public string Name { get; set; }
public bool Active { get; set; }
public IList<WarrantyFeaturesVm> WarrantyFeaturesVm { get; set; } // this is the checkbox ones.
public IList<RewardVms> RewardVms { get; set; } // this is the dyanmic one that I needed the helper for
public CbCreditCardFrmVm()
{
Active = true;
WarrantyFeaturesVm = new List<WarrantyFeaturesVm>();
RewardVms = new List<RewardVms>();
}
}
// view
@foreach (var tier in Model.RewardVms)
{
@Html.Partial("GenerateReward", tier) // in this partial view in the BeginCollectionItem
}
@foreach (var warranties in Model.WarrantyFeaturesVm)
{
using (Html.BeginCollectionItem("WarrantyFeaturesVm"))
{
<span>@warranties.Name:</span>
@Html.TextBoxFor(x => warranties.FeatureId)
@Html.CheckBoxFor(x => warranties.HasFeature)
}
}
()처럼 보인다. 서버로 이동하면 동적 인 모든 것을 올바르게 바인딩하고 보증에 대해서도 콜렉션에 바인드합니다 (콜렉션 수는 1 임). 그러나 WarrantyFeaturesVm 내부에는 아무 것도 묶지 않으며 모든 것이 기본값으로 남습니다.
(Html.BeginCollectionItem("WarrantyFeaturesVm"))
을 사용하여 제거하면 컬렉션을 바인딩하지 않습니다.
누구나 컬렉션에 무엇이 바인딩되지 않는지 알 수 있습니까?
편집
// for loop (works)
<form method="post" id="" action="" class="ui-formwizard ui-helper-reset ui-widget ui-widget-content ui-corner-all" novalidate="novalidate">
<span id="" class="step ui-formwizard-content ui-helper-reset ui-corner-all" style="display: none;">
<input type="hidden" value="6aa20677-d367-4e2a-84f0-9fbe00deb191" name="WarrantyFeaturesVm[0].FeatureId" id="WarrantyFeaturesVm_0__FeatureId" data-val-required="The FeatureId field is required." data-val="true" class="ui-wizard-content ui-helper-reset ui-state-default"> <span>Purchase</span>
<input type="checkbox" value="true" name="WarrantyFeaturesVm[0].HasFeature" id="WarrantyFeaturesVm_0__HasFeature" data-val-required="The HasFeature field is required." data-val="true" class="ui-wizard-content ui-helper-reset ui-state-default"><input type="hidden" value="false" name="WarrantyFeaturesVm[0].HasFeature" class="ui-wizard-content ui-helper-reset ui-state-default">
</form>
//foreach loop beginItemCollection(does not work)
<form method="post" id="" action="" class="ui-formwizard ui-helper-reset ui-widget ui-widget-content ui-corner-all" novalidate="novalidate">
<span id="" class="step ui-formwizard-content ui-helper-reset ui-corner-all" style="display: inline;">
<input type="hidden" value="68ba9241-c409-4f4b-96da-cce13b127c1e" autocomplete="off" name="WarrantyFeaturesVm.index" class="ui-wizard-content ui-helper-reset ui-state-default">
<input type="hidden" value="6aa20677-d367-4e2a-84f0-9fbe00deb191" name="WarrantyFeaturesVm[68ba9241-c409-4f4b-96da-cce13b127c1e].war.FeatureId" id="WarrantyFeaturesVm_68ba9241-c409-4f4b-96da-cce13b127c1e__war_FeatureId" data-val-required="The FeatureId field is required." data-val="true" class="ui-wizard-content ui-helper-reset ui-state-default"> <span>Purchase</span>
<input type="checkbox" value="true" name="WarrantyFeaturesVm[68ba9241-c409-4f4b-96da-cce13b127c1e].war.HasFeature" id="WarrantyFeaturesVm_68ba9241-c409-4f4b-96da-cce13b127c1e__war_HasFeature" data-val-required="The HasFeature field is required." data-val="true" class="ui-wizard-content ui-helper-reset ui-state-default"><input type="hidden" value="false" name="WarrantyFeaturesVm[68ba9241-c409-4f4b-96da-cce13b127c1e].war.HasFeature" class="ui-wizard-content ui-helper-reset ui-state-default">
</span>
</form>
//for loop beginItemCollection (does not work)
<form method="post" id="" action="" class="ui-formwizard ui-helper-reset ui-widget ui-widget-content ui-corner-all" novalidate="novalidate">
<span id="" class="step ui-formwizard-content ui-helper-reset ui-corner-all" style="display: none;">
<input type="hidden" value="fe3fbc82-a2df-476d-a15a-dacd841df97e" autocomplete="off" name="WarrantyFeaturesVm.index" class="ui-wizard-content ui-helper-reset ui-state-default">
<input type="hidden" value="6aa20677-d367-4e2a-84f0-9fbe00deb191" name="WarrantyFeaturesVm[fe3fbc82-a2df-476d-a15a-dacd841df97e].WarrantyFeaturesVm[0].FeatureId" id="WarrantyFeaturesVm_fe3fbc82-a2df-476d-a15a-dacd841df97e__WarrantyFeaturesVm_0__FeatureId" data-val-required="The FeatureId field is required." data-val="true" class="ui-wizard-content ui-helper-reset ui-state-default"> <span>Purchase</span>
<input type="checkbox" value="true" name="WarrantyFeaturesVm[fe3fbc82-a2df-476d-a15a-dacd841df97e].WarrantyFeaturesVm[0].HasFeature" id="WarrantyFeaturesVm_fe3fbc82-a2df-476d-a15a-dacd841df97e__WarrantyFeaturesVm_0__HasFeature" data-val-required="The HasFeature field is required." data-val="true" class="ui-wizard-content ui-helper-reset ui-state-default"><input type="hidden" value="false" name="WarrantyFeaturesVm[fe3fbc82-a2df-476d-a15a-dacd841df97e].WarrantyFeaturesVm[0].HasFeature" class="ui-wizard-content ui-helper-reset ui-state-default">
</span>
<span id="adminSettings" class="step ui-formwizard-content ui-helper-reset ui-corner-all" style="display: inline;">
</form>
foreach 보증은 Html.BeginForm 내부에 있습니까? 몇 가지 견본 HTML 출력을 보증 세트에 게시 하시겠습니까? – danludwig
예, Html.BeginForm에 있습니다. 나는 그것을 (부분적으로) 이해했다고 생각한다. foreach 루프를 forloop으로 변경하면 @ Html.TextBoxFor (x => Model.WarrantyFeaturesVm [i] .FeatureId)와 같은 작업을 수행 할 수 있습니다. beginCollection이 작동하지 않는 이유는 확실하지 않습니다. – chobo2
모델 바인더는 HTML을 봅니다. 두 가지 경우에서 HTML id가 다르게 렌더링되는 방식의 차이점을 확인하십시오. 우리는 BeginCollectionItem과 함께 종종 foreach를 사용하지만 BeginCollectionItem은 부분 또는 편집기 템플릿에있는 경우가 많습니다. – danludwig