Привязка MVC к флажку - PullRequest
       32

Привязка MVC к флажку

11 голосов
/ 06 марта 2012

Я нашел так много вопросов по этому поводу, но ни один из них не прошел или, кажется, не повторил мой сценарий.У меня есть модель:

public class CheckBoxModel
{
            public int Id{ get; set; }
    public bool IsSelected { get; set;  }
}

Затем попробуйте привязать мой IsSelected bool к флажку, подобному следующему:

<%= Html.CheckBox("IsSelectedCheck",Model.IsSelected)%>

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

В данный момент значение IsSelected всегда ложно.Если Html.CheckBox устанавливает значение Model.IsSelected каждый раз, когда пользователь устанавливает флажок.

Спасибо

Ответы [ 2 ]

26 голосов
/ 06 марта 2012

Попробуй так:

<%= Html.CheckBoxFor(x => x.IsSelected) %>

Также, если вы хотите передать идентификатор, не забудьте сделать это:

<%= Html.HiddenFor(x => x.Id) %>

А если у вас была коллекция из них:

public class MyViewModel
{
    public CheckBoxModel[] CheckBoxes { get; set; }
}

Вы могли бы:

<% for (var i = 0; i < Model.CheckBoxes.Length; i++) { %>
    <div>
        <%= Html.HiddenFor(x => x.CheckBoxes[i].Id) %>
        <%= Html.CheckBoxFor(x => x.CheckBoxes[i].IsSelected) %>
    </div>
<% } %>

, который успешно свяжется с:

[HttpPost]
public ActionResult MyAction(MyViewModel model) 
{
    // model.CheckBoxes will contain everything you need here
    ...
}
17 голосов
/ 01 мая 2013

Альтернатива фантастическому ответу Дарина

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

<% foreach (var cb in Model.CheckBoxes) { %>
  <div>
    <input type="checkbox" 
      value="<%= cb.Id %>"
      <%= cb.IsSelected ? "checked=\"checked\"" : "" %>
      name="ids" />
  </div>
<% } %>

Будет привязан к параметру int[] ids в следующем действии:

[HttpPost]
public ActionResult MyAction(int[] ids) 
{
    // ids contains only those ids that were selected
    ...
}
  • Преимущество - более чистый html, поскольку скрытого ввода нет.
  • Стоимость написания большего количества кода в представлении.

В MVC 4.0 (Razor 2.0) вы можете использовать следующий синтаксис:

<input type="checkbox" value="@cb.Id" checked="@cb.IsSelected" name="ids" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...