0

いくつかのリストを含むモデルがあります:

[Display(Name = "Facilities")]
public List<facility> Facilities { get; set; }

[Display(Name = "Accreditations")]
public List<accreditation> Accreditations { get; set; }

これらのリストは、最初にコントローラーから入力します。

public ActionResult Register()
{
    var viewModel = new RegisterModel();

    viewModel.Facilities = m_DBModel.facilities.ToList();
    viewModel.Accreditations = m_DBModel.accreditations.ToList();

    return View(viewModel);
}

それらが私のビューに到達すると、DB レコードが取り込まれます (素晴らしい)。次に、これらのリストをチェックボックスとして表示する部分ビューにモデルを渡し、ユーザーが操作できるようにします (foreach ループの代わりに for ループを使用する別の提案に基づいて試しましたが、違いはありませんでした)。

@model LanguageSchoolsUK.Models.RegisterModel

@foreach (var item in Model.Facilities)
{
    @Html.Label(item.name);
    @Html.CheckBox(item.name, false, new { id = item.facility_id, @class = "RightSpacing", @description = item.description }) 
}

フォームを送信すると、今度はコントローラーでオーバーロードされた登録関数を呼び出してコントローラーに戻ります。

[HttpPost]
public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
        // Do stuff
    }

    return View(model); 
}

問題は、リスト (施設と認定) を含むモデル パラメーターが、リストが null であることを示していることです。

誰かが私が間違っていることを教えてもらえますか?最初に通過したコレクションが入力されていないのはなぜですか?

ありがとう。

4

1 に答える 1

1

foreach ループの代わりに for ループを使用する別の提案に基づいて試しましたが、違いはありませんでした

もう一度やり直してください。今回はもっと運がいいと確信しています。ああ、強く型付けされたヘルパーを使用します。

@model LanguageSchoolsUK.Models.RegisterModel
@for (var i = 0; i < Model.Facilities.Count; i++)
{
    @Html.HiddenFor(x => x.Facilities[i].name)
    @Html.LabelFor(x => x.Facilities[i].IsChecked, Model.Facilities[i].name);
    @Html.CheckBoxFor(
        x => x.Facilities[i].IsChecked, 
        new { 
            id = item.facility_id, 
            @class = "RightSpacing", 
            description = item.description // <!-- HUH, description attribute????
        }
    ) 
}

また、私の回答から、チェックボックスはモデルのブールフィールドで機能し、整数、小数、文字列ではなく=>ブール値ではないことに間違いなく気付くでしょう。

そのため、チェックボックスの状態を保持するモデルにブール値フィールドがあることを確認してください。私の例では、このフィールドは呼び出されIsCheckedていますが、明らかに、より良い名前を自由に見つけることができます。

于 2013-02-05T10:09:09.087 に答える