モデルを渡す部分ビューがあり、ユーザーが選択できるチェックボックスが表示されます。これは最終的にフォームに投稿されるため、チェックされた状態を照会し、必要に応じてデータをDBに挿入できます。
モデルのリストを含むモデルを取得する代わりに、モデルのリストを直接取得して、それを分離し、部分ビューとしてより役立つように、部分ビューを変更したいと思います。問題は、これを行うと、データが正しくバインドされていないように見えることです。以下は、前のコードの例です(正しく機能し、機能しなくなった後)。
誰かが私の変更が有効になっていない理由について、つまり、投稿されたデータを検査する後のコードで、リストがnullであり、正しく入力される前に、誰かが光を当てることができれば非常にありがたいです。
前:
部分ビューを呼び出します。
<fieldset>
<legend>Facilities</legend>
<div class="display-field">
<div>
@{Html.RenderPartial("Partial/FacilityPartial", Model);}
</div>
</div>
</fieldset>
部分図:
@model namespace.Models.SchoolRegisterModel
@for (var i = 0; i < Model.Facilities.Count; i++)
{
@Html.HiddenFor(x => x.Facilities[i].name)
@Html.HiddenFor(x => x.Facilities[i].facility_id)
@Html.LabelFor(x => x.Facilities[i].@checked, Model.Facilities[i].name);
@Html.CheckBoxFor(
x => x.Facilities[i].@checked,
new
{
id = Model.Facilities[i].facility_id,
@class = "RightSpacing",
description = Model.Facilities[i].description
}
)
}
後:
部分ビューを呼び出します。
<fieldset>
<legend>Facilities</legend>
<div class="display-field">
<div>
@{Html.RenderPartial("Partial/FacilityPartial", Model.Facilities);}
</div>
</div>
</fieldset>
部分図:
@model IEnumerable<namespace.Models.facility>
@for (int i = 0; i < Model.Count(); i++)
{
@Html.HiddenFor(x => x.ElementAt(i).name)
@Html.HiddenFor(x => x.ElementAt(i).name)
@Html.HiddenFor(x => x.ElementAt(i).facility_id)
@Html.LabelFor(x => x.ElementAt(i).@checked, Model.ElementAt(i).name);
@Html.CheckBoxFor(
x => x.ElementAt(i).@checked,
new
{
id = Model.ElementAt(i).facility_id,
@class = "RightSpacing",
description = Model.ElementAt(i).description
}
)
}
前もって感謝します!
ジョー
完成したコード(動作中)
モデル:
public class SchoolRegisterModel
{
// ... Lots of data
public string Data { get; set; }
[Display(Name = "Facilities")]
public IEnumerable<FacilityViewModel> Facilities { get; set; }
}
namespace namespace.Models
{
public class FacilityViewModel
{
public FacilityViewModel()
{
}
public FacilityViewModel(facility facil, bool bSelected = false)
{
this.Facility = facil;
this.Selected = bSelected;
}
public facility Facility { get; set; }
public bool Selected { get; set; }
}
}
エディターテンプレート:
@model namespace.Models.FacilityViewModel
@Html.HiddenFor(x => x.Facility.facility_id)
@Html.HiddenFor(x => x.Facility.name)
@Html.LabelFor(x => x.Selected, Model.Facility.name)
@Html.CheckBoxFor(x => x.Selected,
new
{
id = Model.Facility.facility_id,
@class = "RightSpacing",
description = Model.Facility.description
}
)
コントローラ:
// GET: /School/Register
public ActionResult Register()
{
var viewModel = new SchoolRegisterModel();
PopulateFacilityCollection(ref viewModel);
return View(viewModel);
}
private void PopulateFacilityCollection(ref SchoolRegisterModel viewModel)
{
List<FacilityViewModel> FacilityCollection = new List<FacilityViewModel>();
foreach (facility facil in DBModel.facilities)
{
FacilityCollection.Add(new FacilityViewModel(facil));
}
viewModel.Facilities = FacilityCollection;
}
意見:
<fieldset>
<legend>Facility</legend>
<div class="editor-field">
@Html.EditorFor(x => x.Facilities)
</div>
</fieldset>
今はすべてうまくいくようです。これが他の誰かに役立つことを願っています!