Bindowanie słownika z checkboxami

0

Próbuję przeprowadzić ankietę i postanowiłem ViewModel zbindować w ten sposób, że każda kategoria jest wiązana z boolem: użytkownik wybiera te, które mu odpowiadają, i przy kategorii mamy jego wybór. Problem w tym, że po wysłaniu forma mój ViewModel jest pusty. Ma ktoś pomysł/radę, jak zbindować ten słownik, żeby został wypełniony na poziomie kontrolera?

Kontrolery

        public ActionResult Questionnaire()
        {
            var vm = new QuestionnaireViewModel();;
            vm.BestCategories = _db.Categories.ToDictionary(k => k, v => false);
            return View(vm);
        }

        [HttpPost]
        public async Task<ActionResult> Questionnaire(QuestionnaireViewModel model)
        {
            return null;
        }

ViewModel

public class QuestionnaireViewModel
    {
        public IDictionary<Category, bool> BestCategories { get; set; }
    }

Widok

    @using (@Html.BeginForm("Questionnaire", "Account"))
    {
        @Html.AntiForgeryToken()

        <div id="login-error">
            @Html.ValidationMessage("loginerror", "")
            @Html.ValidationSummary()
        </div>

        <table id="login-table" style="margin-left: auto; margin-right: auto;">
            @foreach(var category in Model.BestCategories)
            {
                <tr>
                    <td style="padding: 0px 0px 0px 0px; text-align: left;">
                        @Html.LabelFor(o => o.BestCategories[category.Key], category.Key.Name)
                    </td>
                    <td style="padding: 0px; text-align: left;">
                        @Html.CheckBoxFor(o => o.BestCategories[category.Key])
                    </td>
                    <td></td>
                </tr>
            }
            <tr>
                <td></td>
                <td colspan="2" style="text-align: right; padding-right: 20px;">
                    <button type="submit" class="btn btn-primary">Wyślij</button>
                </td>
            </tr>
        </table>
    }
1

Ja bym spróbował tak.
Model:


public class QuestionnaireModel
    {
        public IDictionary<Category, List<Kategorie>> BestCategories { get; set; }
    }
public class Kategorie
{
    public bool Checkbox { get; set; }
}

Razor:

<form asp-action="Edit">
<div class="row">
 @foreach (var kvp in Model.BestCategories.OrderByDescending(x => x.Key.Name))
 {
   <div class="col-md-2 col-lg-2">
     <fieldset>
         <legend>@kvp.Key.Name</legend>
        @foreach (var version in kvp.Value)
        {
          <div>
           <input type="checkbox" value="@version.Checkbox" @(version.Checkbox ? "checked=\"checked\"" : "") />
         </div>
        }
    </fieldset>
  </div>
  }
  </div>
<input type="submit" value="Save" class="btn btn-default" />
</form>

Bazując na podobnym przykładzie: https://stackoverflow.com/questions/41258733/bind-dictionary-with-list-in-viewmodel-to-checkboxes

0

Tylko pytanie, w jakim celu wrzucać listę jako wartość dla kategorii? Każda z kategorii odpowiada tylko jednemu checkboxowi, a nie liście checkboxów. Wobec tego, jeśli chciałbym z tego skorzystać, wypadałoby napisać wrapper na tego boola w postaci klasy. Pytanie, czy to w ogóle ma sens?

1 użytkowników online, w tym zalogowanych: 0, gości: 1