asp.net MVC флажок головная боль! - PullRequest
9 голосов
/ 08 июня 2009

Я видел много вопросов, связанных с этой темой.

Я использую asp.net MVC 1.0

Проблемная зона

Если я использую

<%= Html.CheckBox("Status", true) %>

Тогда почему это выглядит как

<input checked="checked" id="Status" name="Status" type="checkbox" value="true" /><input name="Status" type="hidden" value="false" />

Я поместил это в цикл foreach, и у меня есть 5 строк.

когда я отправляю форму с true, true, true, false, false тогда я получаю true,false,true,false,true,false,false,false

т.е. для ложного => ложного.

для true => true, false

Если я использую

<input type="checkbox" value="true" name="Status" checked="checked" />

Тогда я не останусь без контроля.

так как мне преодолеть эту проблему?

Пожалуйста, не публикуйте ответ с использованием цикла в объекте formcollection и проверкой каждого ключа!

Ответы [ 10 ]

2 голосов
/ 30 июля 2009

Я знаю, что это не элегантно, но это то, что я сделал:

collection ["response"]. Replace ("true, false", "true"). Split (','). ToList ();

1 голос
/ 14 апреля 2011

Вам нужно будет сделать собственную привязку модели для значений CheckBox.

Получите список значений из FormCollection или Request.Form для этого идентификатора CheckBox и замените true, false на true:

string chkBoxString = Request.Form["checkboxID"].Replace("true,false", "true")

Теперь у вас есть список того, был ли выбран CheckBox или нет .... все остальное сделайте сами:)

1 голос
/ 09 февраля 2011

Лично я считаю, что необходимость проверять «true, false» везде на сервере - это боль. Я написал исправление jquery, которое удалит дополнительное скрытое поле, созданное помощником Html.Checkbox, когда флажок установлен, а затем добавит его обратно, если флажок не установлен. Значения сервера всегда будут «истинными» или «ложными». Списки флажков отчасти субъективны в том, как вы хотите, чтобы они действовали, что я обсуждаю, но я удаляю «ложь» из набора значений, что означает, что значение формы будет исключено, если все поля в списке не отмечены.

http://www.mindstorminteractive.com/blog/?p=386

У меня был довольно хороший успех при использовании этой техники. Пожалуйста, дайте мне знать, если вы попробуете это и у вас возникнут проблемы.

1 голос
/ 08 июня 2009

В вашем примере, когда вы отправляете форму с true, true, true, false, false и вы получаете

true,false,true,false,true,false,false,false
Интересно отметить, что вы на самом деле не возвращаете восемь значений, а пять массивов, которые просто выглядят так, потому что все значения объединены.

Я знаю, что вы просили не получать цикл для вашего ответа, но я могу использовать его, чтобы продемонстрировать, что на самом деле происходит здесь:
foreach (string key in postedForm.AllKeys) {
    // "value" will contain a joined/comma-separated list of ALL values,
    // including something like "true,false" for a checked checkbox.
    string value = postedForm[key].GetValue;
    // "values" will be an array, where you can access its first element,
    // e.g., values[0], to get the actual intended value.
    string[] values = postedForm.GetValues(key);
}

Таким образом, для ваших отмеченных блоков вы получите массив значений с двумя элементами, а для непроверенных блоков вы получите только одноэлементный массив.

Таким образом, чтобы ответить на ваш вопрос как вы преодолеете эту проблему , ответ заключается в использовании GetValues, а не GetValue, и в том, что ваши опубликованные поля представляют собой массивы, а не строки.

Удачи!

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

Чтобы получить значение флажка, даже если оно истинное или ложное

var boolValue = bool.Parse(collection.GetValues("checkboxID")[0])
0 голосов
/ 15 июля 2011

в представлении:

<input id="radio5" type="checkbox" name="rb_abc" value="5"/>

Контроллер:

[AcceptVerbs(HttpVerbs.Post)]
 public ActionResult YourForm(FormCollection fc)
 { 
      if (fc["rb_abc"] == "on")
      {
           //Hey .. you have selected a Radio Button.. just kidding.. its a CheckBox
      }
 }
0 голосов
/ 14 апреля 2010

Проще просто проверить, есть ли AttemptedValue.Contains ("true") - если проверено, то не будет, если не отмечено ....

0 голосов
/ 11 октября 2009

это было предназначено для использования только для простого CheckBox, вам нужен checkboxList, который еще не описан в API ASP.net MVC

Если вы ищете что-то вроде контрольного списка, возможно, вам следует написать своего собственного помощника, если вы хорошо понимаете HTML ..

Вот и все! :)

0 голосов
/ 09 июня 2009

Ну, есть несколько способов, которые вы можете сделать, исходя из ваших требований.

Я использую этот метод.

<input type="checkbox" value="<%= item.ID %>" name="check" checked="checked")" />

Это могут быть флажки.

На стороне сервера у меня также будет массив идентификаторов элементов в модели. Поэтому я проверяю, находится ли он в массиве

var strArray = form["checkbox"]; //Request.form["checkbox"] or "FormCollection form" in action parameter;  array of ID's in comma separated string.

У разных людей разные тесты.

0 голосов
/ 08 июня 2009

Отображается так, потому что для связывателя по умолчанию требуется, чтобы FormCollection имела значение для ненулевых параметров. Используя эту технику, мы уверены, что значение будет отправлено, даже если флажок не установлен (по умолчанию значение отправляется только тогда, когда оно отмечено). Если вы используете этот метод контроллера только с одним вводом html, вы получите ошибку при публикации формы с не отмеченным флажком (значение флажка не будет опубликовано, и связыватель не будет знать, что использовать для значения isItemSelected):

public ActionResult SomeActionMethod(bool isItemSelected)

Вы можете попробовать использовать что-то вроде этого только с одним вводом html:

public ActionResult SomeActionMethod(bool? isItemSelected)

Но в этом случае isItemSelected будет нулевым или будет истинным. И это никогда не станет ложным.

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