Контроллеры MVC получают значение 'Checkboxlist'

Я, наверное, здесь идиот, но у меня проблемы с получением значения того, установлен ли флажок или нет или нет. Вот что у меня так далеко:

В моей модели:

public IEnumerable<SelectListItem> Insurers
{
  get
    { 
      var list = new List<SelectListItem>();
      string zInsurersList = "Age UK,Be Wiser,Call Connection,Churchill,Sainsbury's,Direct Line,Hastings Direct,LV=,Nationwide,RIAS,Swinton";
      string[] zInsurers = zInsurersList.Split(',');
      foreach (string aInsurer in zInsurers)
      {
        list.Add(new SelectListItem() { Text = aInsurer, Value = aInsurer, Selected=false});
      }
      return list;
    }
  }
}

И мой взгляд:

@foreach (var insurer in @Model.Insurers)
{
  var zInsurer = insurer.Text;
  var zValue = insurer.Value;
  <tr>
    <td style="width: 120px; height: 35px;"><span id="@zInsurer">@zInsurer</span></td>
    <td style="width: 40px; height: 35px;"><input id="@zInsurer" type="checkbox" name="@zInsurer"></td>
  </tr>
}

Поэтому в моем контроллере я пытаюсь зациклить список и получить значение того, выбрал ли пользователь параметр:

foreach (var item in model.Insurers)
{
  //if (item.GetType() == typeof(CheckBox))
  //string controlVal = ((SelectListItem)item).Selected.ToString();
  zInsurers = zInsurers + item.Text + " " + ((SelectListItem)item).Selected.ToString() + "<br/>";
}

Но значение всегда возвращает false.

Может ли кто-нибудь уделить несколько минут, чтобы подчеркнуть мою глупость, пожалуйста?

Спасибо,

Craig

5 ответов

Решение

Есть много способов сделать это. Я обычно добавляю String Array в модель для сбора выбранных значений.

public string[] SelectedInsurers { get; set; }

<input type="checkbox" name="SelectedInsurers" value="@insurer.Value" />

Вот пример кода -

MyModel

public class MyModel
{
    public string[] SelectedInsurers { get; set; }

    public IEnumerable<SelectListItem> Insurers
    {
        get
        {
            var list = new List<SelectListItem>();
            string zInsurersList = "Age UK,Be Wiser,Call Connection,Churchill,Sainsbury's,Direct Line,Hastings Direct,LV=,Nationwide,RIAS,Swinton";
            string[] zInsurers = zInsurersList.Split(',');
            foreach (string aInsurer in zInsurers)
            {
                list.Add(new SelectListItem { Text = aInsurer, Value = aInsurer, Selected = false });
            }

            return list;
        }
    }
}

Методы действия

public ActionResult Index()
{
    return View(new MyModel());
}

[HttpPost]
public ActionResult Index(MyModel model)
{
    return View();
}

Посмотреть

@using (Html.BeginForm())
{
    foreach (var insurer in @Model.Insurers)
    {
        <input type="checkbox" name="SelectedInsurers" value="@insurer.Value" /> @insurer.Text<br/>
    }
    <input type="submit" value="Post Back" />
}

Результат

Во-первых, ваша собственность Insurers не должно быть IEnumerable<SelectListItem> (это для связывания коллекции с выпадающим списком), и в любом случае, такая логика не принадлежит getter (и какой смысл создавать строку с разделителями-запятыми и затем разбивать ее? - просто сначала создайте массив строк!). Не совсем понятно, что именно вы пытаетесь сделать, но вы должны создавать модель представления и делать это способом MVC, а также использовать функции привязки модели.

Посмотреть модель

public class InsurerVM
{
  public string Name { get; set; }
  public bool IsSelected { get; set; }
}

контроллер

public ActionResult Edit()
{
  // This should be loaded from some data source
  string[] insurers = new string[] { "Age UK", "Be Wiser", "Call Connection" };
  List<InsurerVM> model = insurers.Select(i => new InsurerVM() { Name = i }).ToList();
  return View(model);
}

Посмотреть

@model List<InsurerVM>
@using(Html.BeginForm())
{
  for (int i = 0; i < Model.Count; i++)
  {
    @Html.HiddenFor(m => m[i].Name)
    @Html.CheckBoxFor(m => m[i].IsSelected)
    @Html.LabelFor(m => m.[i].IsSelected, Model[i].Name)
  }
  <input type="submit" value="Save" />
}

Почтовый метод

[HttpPost]
public ActionResult Edit(IEnumerable<InsurerVM> model)
{
  // loop each item to get the insurer name and the value indicating if it has been selected
  foreach(InsurerVM insurer in model)
  {
    ....
  }
}

В действительности, Insurers будет объектом с ID и другие свойства, чтобы его можно было идентифицировать и иметь связь с другими объектами.

Что касается того, почему ваш код не работает. Ваша собственность не имеет сеттера, так что ничто, отправленное назад, не может быть связано в любом случае. Все, что делает метод - это инициализирует вашу модель, затем вызывает метод получения, который создает новый IEnumerable<SelectListItem> (идентичный тому, который вы отправили на просмотр в первую очередь). Не то чтобы это имело значение в любом случае, ваши флажки имеют name атрибуты name="Age_UK", name=Be_Wiser" и т.д., которые не имеют абсолютно никакого отношения к вашей модели, поэтому не могут быть связаны

Это потому, что привязка модели не может обрабатывать ваши значения.

Вы должны посмотреть на привязку модели.

Попробуйте что-то вроде этого:

  @for (var countInsurer = 0; Model.Insurers.Count > countInsurer++)
                    {
                        var zInsurer = insurer.Text;
                        var zValue = insurer.Value;
                        <tr>
                            <td style="width: 120px; height: 35px;"><span id="@zInsurer">@zInsurer</span></td>
                            <td style="width: 40px; height: 35px;">@Html.CheckBoxFor(m=> Model.Insurers[countInsurer], new {name = zInsurer})</td>
                        </tr>
                    }
 @for(int i = 0; i < Model.List.Count; i++)
                            {
                                @Html.CheckBoxFor(m => Model.List[i].IsChecked, htmlAttributes: new { @class = "control-label col-md-2" })
                                @Model.List[i].Name
                                @Html.HiddenFor(m => Model.List[i].ID)
                                @Html.HiddenFor(m => Model.List[i].Name)
                            <br />
                            }  

в контроллере

StringBuilder sb = new StringBuilder();
                    foreach (var item in objDetail.List)
                    {
                        if (item.IsChecked)
                        {  
                            sb.Append(item.Value + ",");
                        }
                    }    
                    ViewBag.Loc = "Your preferred work locations are " + sb.ToString();

Я получаю модуль и права из таблицы модулей и прав Как отправить все данные в таблицу RoleRight Все значения флажка

public class RoleRightModel
{        
    public ModuleModel _ModuleModel { get; set; }
    public RightsModel _RightsModel { get; set; }
    public RolesModel _RolesModel { get; set; }
    public List<ModuleModel> _ModuleModelList { get; set; }
    public List<RightsModel> _RightsModelList { get; set; }
    public List<RolesModel> _RolesModelList { get; set; }
    public List<RoleRightModel> _RoleRightModelList { get; set; }
    public int RoleRightID { get; set; }
    public int RoleID { get; set; }
    public int ModuleID { get; set; }
    public int FormMode { get; set; }
    public int RightCode { get; set; }
    public bool? RowInternal { get; set; }
    public byte? IsAuthorised { get; set; }
    public int? CreationID { get; set; }
    public DateTime? CreationDate { get; set; }
    public int? LastModificationID { get; set; }
    public DateTime? LastModificationDate { get; set; }
    public byte? RowStatus { get; set; }

    public string RoleName { get; set; }
}

бритва

@foreach(var item in Model._ModuleModelList.Where(x => x.Level == 1))
{
    <ul style="display: block;">
        <li><i class="fa fa-plus"></i>
            <label>
                @if (item.Level == 1)
                {
                    <input id="node-0-1" data-id="custom-1" type="checkbox" name="Module" value="@item.ModuleID"@(Model._ModuleModel.ModuleID)? "checked":"">
                    @item.ModuleName

                }
            </label>
            @foreach (var lavel1 in Model._ModuleModelList.Where(x => x.ParentModuleID == item.ModuleID))
            {
                <ul>
                    <li><i class="fa fa-plus"></i>
                        <label>
                            <input id="node-0-1-1" data-id="custom-1-1" type="checkbox" name="Module" value="@lavel1.ModuleID"@(Model._ModuleModel.ModuleID)? "checked":"">
                            @lavel1.ModuleName
                        </label>
                        @foreach (var lavel2 in Model._ModuleModelList.Where(x => x.ParentModuleID == lavel1.ModuleID))
                        {
                            <ul>
                                <li><i class="fa fa-plus"></i>
                                    <label>
                                        <input id="node-0-1-1-1" data-id="custom-1-1-1" type="checkbox" name="Module" value="@lavel2.ModuleID"@(Model._ModuleModel.ModuleID)? "checked":"">
                                        @lavel2.ModuleName
                                    </label>
                                    @foreach (var lavel3 in Model._RightsModelList.Where(x => x.ModuleId == lavel2.ModuleID))
                                    {
                                        <ul>
                                            <li>
                                                <label>

                                                    <input id="node-0-1-1-1-1" data-id="custom-1-1-1-1" type="checkbox" name="Right" value="@lavel3.RightID"@(Model._RightsModel.RightID)? "checked":"">
                                                    @lavel3.RightName
                                                </label>
                                            </li>
                                        </ul>
                                    }
                                </li>
                            </ul>
                        }
                    </li>
                </ul>
            }
        </li>
    </ul>
}
Другие вопросы по тегам