Как в MVC 6 закодировать список флажков и передать проверенные значения контроллеру?

Извините, но большинство моих поисков приводит меня к старым кодам MVC. Любая помощь будет оценена по достоинству.

В MVC 6 с помощниками тегов, как вы кодируете набор флажков:

  • Используйте помощник тега для метки, чтобы щелкнуть по нему, чтобы переключить отмеченное значение
  • Сохранить (привязать?) Отмеченное значение к свойству IsOptionSelected
  • Передайте эти проверенные значения обратно в контроллер после нажатия кнопки «Отправить».

?

Мне удалось правильно отобразить флажки с метками, но я не знаю, как передать проверенные значения обратно в контроллер через модель. Прямо сейчас значения IsOptionSelected возвращаются как ложные.

Я также смог заставить работать помощник html для метки, но не для помощника тега. Возможно, я все это неправильно кодирую, так что любые советы помогут!

Вот что у меня есть на данный момент:

Медийная реклама:

Флажки в параметрах телефона

Сущность:

public class PhoneOption
{
    public bool IsOptionSelected { get; set; } = false;
    public int OptionId { get; set; }
    public string OptionName { get; set; }
}

Модель:

[Display(Name = "Phone Options")]
public IEnumerable<PhoneOption> PhoneOptions { get; set; }

. . . .
PhoneOptions = repository.GetPhoneOptions();

Репозиторий:

public IEnumerable<PhoneOption> GetPhoneOptions()
{
    IEnumerable<PhoneOption> options = new[]
    {
        new PhoneOption { OptionId = 1, OptionName = "Phone Case",       IsOptionSelected = false },  
        new PhoneOption { OptionId = 2, OptionName = "Screen Protector", IsOptionSelected = false },
        new PhoneOption { OptionId = 3, OptionName = "Car Charger",      IsOptionSelected = false },
        new PhoneOption { OptionId = 4, OptionName = "Extra Cable",      IsOptionSelected = false }
    };
    return options;
 }

Просмотр:

<div class="form-group">
    <label class="control-label">Phone Options</label>
    <div>
        @foreach (var option in Model.PhoneOptions)
        {
            <div>
                @{ string cbId = "PhoneOption_" + @option.OptionId; }
                <input [email protected] type="checkbox" [email protected] id=@cbId name=@cbId />
                @Html.Label(@cbId.ToString(), @option.OptionName)
                @*This is causing invalid operation exception*@
                @*<label [email protected]()>@option.OptionName</label>*@ 
                <span asp-validation-for=@cbId class="text-danger" role="alert"></span>
            </div>
        }
    </div>    
</div>

Заранее спасибо!


person niki b    schedule 26.04.2016    source источник
comment
Я предполагаю, что asp-for используется неправильно. Измените вход [email protected] на asp-for = IsOptionSelected, чтобы убедиться, что он привязан к правильному свойству в PhoneOption. То же самое в метке [email protected] () неверно. Ознакомьтесь с руководством здесь, чтобы узнать о помощниках по тегам. davepaquette.com/archive/2015/05/18/mvc6-select-tag-helper.aspx   -  person Amete Blessed    schedule 26.04.2016
comment
Спасибо за предложение, но изменение на asp-for = IsOptionSelected вызывает синтаксическую ошибку, поскольку ее нет в основной модели. Это часть параметра Model.PhoneOption для каждой итерации. asp-for = option.IsOptionSelected тоже не сработает. И да, я уже читал это руководство раньше, но оно не охватывает список флажков, как то, что я пытаюсь сделать.   -  person niki b    schedule 26.04.2016
comment
Ах, я понял. Проверьте, помогает ли это http://stackoverflow.com/questions/15375800/model-binding-to-a-list-mvc-4   -  person Amete Blessed    schedule 26.04.2016
comment
@AmeteGirl. +1 за полезную ссылку.   -  person niki b    schedule 27.04.2016


Ответы (2)


Это, наконец, то, что я сделал, чтобы все заработало. Я не уверен, что это лучший способ сделать это. Мне все еще приходилось использовать помощники html, потому что помощники тегов не работают.

Модель:

public List<PhoneOption> PhoneOptions { get; set; }
. . .
PhoneOptions = repository.GetPhoneOptions().ToList();

Просмотр:

@if (@Model.PhoneOptions != null && @Model.PhoneOptions.Count() > 0)
{
    for (int i = 0; i < @Model.PhoneOptions.Count(); i++)
    {
        <div>
            <input asp-for="@Model.PhoneOptions[i].IsOptionSelected" type="checkbox" />
            <label asp-for="@Model.PhoneOptions[i].IsOptionSelected">@Model.PhoneOptions[i].OptionName</label>

            @*If these are not included, all OptionIds become 0 and all OptionName becomes null*@
            @Html.HiddenFor(x => @Model.PhoneOptions[i].OptionId)
            @Html.HiddenFor(y => @Model.PhoneOptions[i].OptionName)
        </div>
    }    
}

Надеюсь, это поможет кому-то еще, у кого такие же проблемы со списком флажков.

ОБНОВЛЕНИЕ. Я обновил помощники HTML для помощников тегов выше.

person niki b    schedule 26.04.2016
comment
Рад, что это сработало для вас, и спасибо, что опубликовали свое решение. - person Amete Blessed; 27.04.2016
comment
Использование помощников тегов должно работать нормально - <input asp-for="Model.PhoneOptions[i].IsOptionSelected" type="checkbox" /> при условии, что вы используете цикл for, а коллекция составляет IList<T> (не IEnumerable<T> - person ; 27.04.2016
comment
Спасибо, @StephenMuecke! Я попробовал, и это сработало с небольшим изменением - <input asp-for="@Model.PhoneOptions[i].IsOptionSelected" type="checkbox" id="@cbId" />. Я все еще не могу сделать помощник тега для метки, чтобы прикрепить ее к флажку. И то, и другое: 1) <label asp-for="@Model.PhoneOptions[i].IsOptionSelected">@Model.PhoneOptions[i].OptionName</label> и 2) <label asp-for="@cbId">@Model.PhoneOptions[i].OptionName</label> нельзя щелкнуть для переключения значения флажка. Если вы знаете, как это сделать, это будет здорово! - person niki b; 27.04.2016
comment
Вам необходимо удалить атрибут id (тот факт, что его id="@cbId" предполагает, что он даже не уникален, и, следовательно, вы создаете недопустимый html. - <input asp-for="@Model.PhoneOptions[i].IsOptionSelected" type="checkbox" /> и <label asp-for="@Model.PhoneOptions[i].IsOptionSelected">@Model.PhoneOptions[i].OptionN‌​ame</label> - person ; 28.04.2016
comment
@StephenMuecke. Это было первое, что я попробовал, и поначалу это не сработало. Вот почему я прибег к ручному назначению идентификатора (на самом деле он уникален, потому что идентификаторы OptionId уникальны), но это не очень элегантное решение, которое я знаю. А теперь я снова изменил его на то, что вы ей предложили, и теперь это работает! (почесывая голову). Должно быть что-то еще у меня было, что помешало прикрепить ярлык к флажку. Но спасибо большое! - person niki b; 28.04.2016

Вот как должен быть синтаксис в вашем для каждого asp-for должен быть заключен в строку с кавычками.

 @foreach (var option in Model.PhoneOptions)
        {
            <div>
                @{ string cbId = "PhoneOption_" + @option.OptionId; }
                <input asp-for="@option.IsOptionSelected" type="checkbox" value="@option.IsOptionSelected" id="@cbId" name="@cbId" />
                @Html.Label(@cbId.ToString(), @option.OptionName)
                @*This is causing invalid operation exception*@
                @*<label asp-for="@cbId">@option.OptionName</label>*@ 
                <span asp-validation-for="@cbId" class="text-danger" role="alert"></span>
            </div>
        }
person Amete Blessed    schedule 26.04.2016
comment
Извините, я пробовал это, но значения IsOptionSelected по-прежнему публикуются как ложные в контроллере, даже если установлены флажки. - person niki b; 26.04.2016