Как обрабатывать флажки в формах ASP.NET MVC? - PullRequest
247 голосов
/ 21 октября 2008

Внимание: этому вопросу больше девяти лет!

Ваш лучший вариант - искать новые вопросы или искать ответы ниже, чтобы найти вашу конкретную версию MVC, так как многие ответы здесь устарели.

Если вы найдете ответ, который подходит для вашей версии, убедитесь, что в ответе содержится версия MVC, которую вы используете.
(оригинальный вопрос начинается ниже)


Мне это кажется немного странным, но, насколько я могу судить, именно так вы и делаете.

У меня есть коллекция объектов, и я хочу, чтобы пользователи выбирали один или несколько из них. Это говорит мне "форма с флажками". Мои объекты не имеют никакого понятия «выбранный» (они элементарные POCO, сформированные путем десериализации вызова wcf). Итак, я делаю следующее:

public class SampleObject{
  public Guid Id {get;set;}
  public string Name {get;set;}
}

В виде:

<%
    using (Html.BeginForm())
    {
%>
  <%foreach (var o in ViewData.Model) {%>
    <%=Html.CheckBox(o.Id)%>&nbsp;<%= o.Name %>
  <%}%>
  <input type="submit" value="Submit" />
<%}%>

И, в контроллере, это единственный способ выяснить, какие объекты проверял пользователь:

public ActionResult ThisLooksWeird(FormCollection result)
{
  var winnars = from x in result.AllKeys
          where result[x] != "false"
          select x;
  // yadda
}

Во-первых, он причудливый, а во-вторых, для тех элементов, которые проверял пользователь, FormCollection отображает его значение как «истинное ложное», а не просто истинное.

Очевидно, я что-то упустил. Я думаю, что это построено с мыслью о том, что объекты в коллекции, которые обрабатываются в html-форме, обновляются с помощью UpdateModel() или через ModelBinder.

Но мои объекты не созданы для этого; Значит ли это, что это единственный путь? Есть ли другой способ сделать это?

Ответы [ 22 ]

0 голосов
/ 21 апреля 2011

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

Таким образом, выполнение проверенного или истинного теста будет:

//looking for [true],[false]
bool isChecked = form.GetValues(key).Contains("true"); 

Ложная проверка будет:

//looking for [false],[false] or [false]
bool isNotChecked = !form.GetValues(key).Contains("true"); 

Основное различие заключается в использовании GetValues, поскольку это возвращает в виде массива.

0 голосов
/ 10 августа 2011

Просто сделайте это на $(document).ready:

$('input:hidden').each(function(el) {
    var that = $(this)[0];
    if(that.id.length < 1 ) {

        console.log(that.id);
        that.parentElement.removeChild(that);

    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...