2

モデルを渡す部分ビューがあり、ユーザーが選択できるチェックボックスが表示されます。これは最終的にフォームに投稿されるため、チェックされた状態を照会し、必要に応じてデータを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>

今はすべてうまくいくようです。これが他の誰かに役立つことを願っています!

4

1 に答える 1

1

問題は、エディター テンプレートを使用する必要があるときに、部分ビューを使用しているように見えることです。パーシャルを使用する場合、Html ヘルパーが生成する名前/ID で完全なオブジェクト階層を保持するために、完全なモデルを渡す必要があります。Model Binder は逆シリアル化中にこれらの名前を使用するため、階層が失われると... データを再飽和することはできません。

代わりにエディター テンプレートを使用することをお勧めします。これにより、最上位モデルで必要なオブジェクトのみを渡しながら、部分ビューの Razor コードを同じに保つことができます...あなたの場合はリストです。

それらの使用方法に関する非常に優れたチュートリアルは次のとおりです。http://coding-in.net/asp-net-mvc-3-how-to-use-editortemplates/

于 2013-02-15T20:41:58.650 に答える