1

いくつかの子コントロールをレンダリングするために、その中に部分的なビューがあるフォームがあります。

メインビュー:

@model Test_mvc.Models.Entity.Question
@{
    ViewBag.Title = "Edit";
    Layout = "~/Areas/Admin/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm())
{
    @*snip*@
    <fieldset>
        <legend>Profils</legend>
        @Html.Action("CheckboxList", "Profil", new { id_question = Model.id })
    </fieldset>
    <p>
        <input type="submit" value="Enregistrer" />
    </p>
}

プロファイル コントローラー (部分ビュー用) :

    [ChildActionOnly]
    public ActionResult CheckboxList(int id_question)
    {
        var profils = db.Profil.Include("Profil_Question")
            .OrderBy(p => p.nom).ToList();
        ViewBag.id_question = id_question;
        return PartialView(profils);
    }

Profile.CheckBoxList ビュー:

@model List<Test_mvc.Models.Entity.Profil>
@foreach (var p in Model)
{
    <input type="checkbox" name="profil_@(p.id)"
        @if (p.Profil_Question.Where(pc => pc.id_question == ViewBag.id_question).Any())
        {
            @:checked="checked"
        } />
    @Html.Label("profil_" + p.id, p.nom)
    <br />
}

(チェックボックスがチェックされているときに「true、false」が送信されるのが嫌いなので、@Html.CheckBoxを使用したくありません)。

今日、チェックされたチェックボックスを取得したい場合は、これを行いますが、ひどいと思います:

質問コントローラー (メイン ビュー用) :

    [HttpPost]
    public ActionResult Edit(Question question)
    {
        if (ModelState.IsValid)
        {
            db.Question.Attach(question);
            db.ObjectStateManager.ChangeObjectState(question, EntityState.Modified);
            db.SaveChanges();

            // this is what I want to change :
            foreach (string r in Request.Form)
            {
                if (r.StartsWith("profil_") && (Request.Form[r] == "true" || Request.Form[r] == "on")) {
                    var p_q = new Models.Entity.Profil_Question();
                    p_q.id_profil = int.Parse(r.Replace("profil_", ""));
                    p_q.id_question = question.id;
                    db.AddToProfil_Question(p_q);
                }
            }

            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(question);
    }

最後のコード セクションの「foreach」をどのように置き換えますか?

ありがとう

4

1 に答える 1

1

私が最初に試みることは、すべてのチェックボックスに同じ名前を付け、@id をボックスの値として配置することです。

@foreach (var p in Model) {     
     <input type="checkbox" name="profil_checkbox" value="@p.id" 
     @if (p.Profil_Question.Where(pc => pc.id_question == ViewBag.id_question).Any()) 
     {
         @:checked="checked"
     } />  
@Html.Label("profil_" + p.id, p.nom)     <br /> } 

次に、検索するのではなく、はるかに扱いやすいprofil_@id結果の配列を取得する必要があります。profile_checkboxMVC3 がこれをどのように処理するか正確には覚えていないので、ポストバックで正確に何が得られるかは保証できませんが、デバッグ中に簡単に確認できるはずです。

于 2012-05-10T13:46:30.317 に答える