ASP.Net MVC 3 Получить значения списка флажков - PullRequest
6 голосов
/ 02 апреля 2012

Я занимаюсь разработкой веб-приложения ASP.Net MVC 3, и у меня возникают трудности с получением значений из списка флажков. Я уже прочитал большинство вопросов о Stackoverflow в этой области, однако у меня все еще есть некоторые проблемы.

У меня есть ViewModel

public class ViewModelCheckBox
{
    public string Id { get; set; }
    public string Name { get; set; }
    public bool Checked { get; set; }
}

Другая ViewModel, которая использует вышеупомянутую модель представления

public class ViewModelAssignSubSpeciality
{
    public ListItem Item { get; set; }
    public IList<ViewModelCheckBox> SpecialityList { get; set; }
}

Тогда в моем контроллере

public ActionResult AssignSubSpeciality(int id)
{
        //Get a list of all sub-specialities
        var SpecialityList = _listService.GetListItemsByID(3).ToList();

        //Get a list of sub-specialities for the the passed in id, this is either the id of a speciality or grade
        IList<RelationshipSpecialitySub> assignedSpecialities = _listService.GetAssignedSubSpecialities(id).ToList();

        var checkBoxList = new List<ViewModelCheckBox>();

        foreach (ListItem item in SpecialityList)
        {
            ViewModelCheckBox chkBox = new ViewModelCheckBox { Id = item.listItemID.ToString(), Name = item.description };

            //If sub-speciality exists in assignedSpecialities list, then make checkbox checked
            foreach (var specilaity in assignedSpecialities)
            {
                if (specilaity.subID == item.listItemID)
                {
                    chkBox.Checked = true;
                }
                else
                {
                    chkBox.Checked = false;
                }
            }

            checkBoxList.Add(chkBox);
        }

        ViewModelAssignSubSpeciality viewModel = new ViewModelAssignSubSpeciality();
        viewModel.ListItem = _listService.GetListItemByID(id);
        viewModel.SpecialityList = checkBoxList;

        return View(viewModel);
    }

Код в вышеприведенном контроллере получает список всех возможных элементов списка флажков, а затем получает список всех ранее выбранных элементов списка флажков, для которых он устанавливает для параметра флажка значение true.

Мой взгляд затем выглядит следующим образом, перебирая SpecialityList и создавая флажок для каждого элемента, а также устанавливая его выбранное значение в true, если это необходимо.

<fieldset>
<legend>Specialities</legend>

@foreach (var item in Model.SpecialityList)
{
<input type="checkbox" id="@item.Id" name="@item.Name" value="@item.Id" @(item.Checked ? "checked" : "") />
<label for="@item.Id">@item.Name</label><br />
}

<input type="submit" value="Save Changes" class="sepH_b" />                                         

Мой метод HttpPost в моем контроллере выглядит следующим образом

    public ActionResult AssignSubSpeciality(ViewModelAssignSubSpeciality model)
    {
        //delete all sub-specialities in tbl relationshipSpecialitySub for List
        foreach (ViewModelCheckBox item in model.SpecialityList)
        {
                //_listService.DeleteSubSpecialityFromSpeciality(item.Id);
        }

        return RedirectToAction("ListItems", new { id = model.ListItem.listID });
    }

Однако, когда я пытаюсь установить выбранные флажки в

model.SpecialityList

Это мы всегда нулевые. Я не уверен, почему он не содержит список ViewModelCheckBox.

Может кто-нибудь помочь мне с этим?

Спасибо.

Ответы [ 3 ]

15 голосов
/ 02 апреля 2012

У меня есть Enumerable из них в моей модели представления

public class CheckBoxItem
{
   public string Code { get; set; }
   public bool IsChecked { get; set; }
   public string Label {get;set;}
}

Затем я использую шаблон редактора для отображения их на странице.

<p class="checkbox" style="display:inline">
<span style="margin-left:5px;">
    @Html.HiddenFor(x => x.Code)           
    @Html.CheckBoxFor(x => x.IsChecked)
</span>
@Html.LabelFor(x => x.IsChecked, Model.Label)
</p>

В представлении, которое я используюзатем, чтобы отобразить их на странице.

@Html.EditorFor(m => m.MyEnumerableOfCheckBoxItem)

Когда форма отправлена ​​обратно, модель правильно привязана.

Надеюсь, это поможет.

0 голосов
/ 12 ноября 2018

@ RubbleFord предоставил отличный ответ. Он может упасть, если на одной странице создается несколько списков, так как метки для свойства будут ссылаться на метку вверх по странице.

Чтобы решить эту проблему, я изменил шаблон редактора на это:

<p class="checkbox" style="display:inline">
    <label>
        @Html.HiddenFor(x => x.Code)
        @Html.CheckBoxFor(x => x.IsChecked)
        @Model.Label
    </label>
</p>

Все остальное то же самое, но это оборачивает флажок с меткой, так что For может быть удален.

0 голосов
/ 02 апреля 2012

Это потому, что вы дали флажку имя @item.Name.Связыватель модели проверит, может ли он сопоставить его с определенным свойством в модели, но не может найти его, потому что ищет значение @item.Name, а не свойство SpecialtyList.

Фил Хаак имеет хорошую статью о привязке модели к списку.Я предлагаю вам проверить это.

Кроме того, я не думаю, что вы можете смоделировать привязку к пользовательскому объекту, потому что значения входящих флажков - это просто строки.Вам следует создать другое свойство в вашей модели, имеющее тип IEnumerable, для которого значения флажков привязаны к модели.Это будет выглядеть так:

public IList<ViewModelCheckBox> SpecialityList { get; set; }
public IEnumerable<string> SpecialityListValues { get; set; }

Таким образом, вы можете использовать SpecialityList для заполнения значений в представлении и SpecialityListValues для получения значений.Обратите внимание, что название флажков должно соответствовать SpecialityListValues.

...