Подтвердить что ты не робот

Почему Html.Checkbox( "Видимый" ) возвращает "true, false" в ASP.NET MVC 2?

Я использую Html.Checkbox("Visible") для отображения флажка для пользователя. В столбце FormCollection["Visible"] значение равно true, false. Почему?

в поле зрения:

<td>                
    <%: Html.CheckBox("Visible") %>
</td>

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

 adslService.Visible = bool.Parse(collection["Visible"]);
4b9b3361

Ответ 1

Что, поскольку помощник CheckBox создает дополнительное скрытое поле с тем же именем, что и флажок (вы можете увидеть его, просмотрев сгенерированный исходный код):

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

Таким образом, оба значения отправляются в действие контроллера при отправке формы. Здесь комментарий непосредственно из исходного кода ASP.NET MVC, объясняющий аргументы за этим дополнительным скрытым полем:

if (inputType == InputType.CheckBox) {
    // Render an additional <input type="hidden".../> for checkboxes. This
    // addresses scenarios where unchecked checkboxes are not sent in the request.
    // Sending a hidden input makes it possible to know that the checkbox was present
    // on the page when the request was submitted.
    ...

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

public ActionResult SomeAction(bool visible)
{
    ...
}

Ответ 2

Недавно я рассмотрел эту проблему и придумал метод обхода ссылки MVC и использования Contains ( "true" ) в строке запроса. Для меня ничего не работало.

Если люди застряли с другими ответами, то это то, что сработало для меня - http://websitesorcery.com/post/2012/03/19/CheckBox-Issue-with-MVC-3-WebGrid-Paging-Sorting.aspx

Ответ 3

Если вам нужно/нужно использовать FormCollection, вместо проверки на true или false, проверьте true,false или false.

например. вместо этого

adslService.Visible = bool.Parse(collection["Visible"]);

сделайте это

adslService.Visible = bool.Parse(collection["Visible"] != "false");

Ответ 4

У меня была такая же проблема в MVC 4,

Это решение сработало для меня.

Моя (форма) Просмотр:

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

Для того, чтобы исключить повторяющиеся значения "true, false", когда CheckBox истинно

Я сохранил параметр CheckBox в массиве:

var arrParams = Request.Form["SomeBoolValue"].Split(',');

Возьмите первый элемент:

string sParam = arrParams[0].ToString();

Разберите его:

bool BoolValue = bool.Parse(sParam);

Сохраните его:

MyObject.SomeBoolValue = BoolValue;

Ответ 5

У меня была такая же проблема. Я исправил его следующей комбинацией (с небольшой помощью Дарина Димитрова - спасибо):

VIEW:

<label for="optIn"><%=Html.CheckBox("optIn", ViewData["OptIn"])%>

Контроллер:

public ActionResult Index()
{
   ViewData["Optin"] = True;
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection form, bool OptIn )
{        
    ViewData["Optin"] = OptIn;
}

Здесь источник управления с флажком и без него действительно проверен (для справки):

Проверено:

<input Length="4" checked="checked" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" />

Переполнение:

<input Length="4" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" />

Итак, вот как я интерпретирую поведение:

HTML не будет возвращать значение поля, если флажок снят, но будет отправлен обратно, если он есть. Помощник добавляет скрытое поле после элемента управления флажком (значение "False" ). Если флажок установлен, источник показывает "checked = 'checked", если он не установлен, это не отображается. Итак, если checked = checked, true передается обратно контроллеру. Если флажок не отмечен, элемент управления не передается обратно, поэтому скрытое поле, названное так же, принимает и возвращает false. Таким образом, у вас есть оба условия. Странно, но он работает. Надеюсь, это поможет.

Ответ 6

Поведение MVC Entension для Html.Checkbox по умолчанию создает скрытое поле вместе с ним для публикации. В моем случае, поскольку пользовательский флажок, который я добавил на страницу, не привязан к модели, как Html.CheckBoxFor, я решил сделать это как простой html флажок.

<input type="checkbox" name="WithAttachment" checked="checked"/> Include Attachments

Ответ 7

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

            if (sBool.StartsWith("true,")) bReturn = true;//cater for mvc checkboxes

            else if (sBool == "true") bReturn = true;

            else if (sBool == "t") bReturn = true;//t-f

            else if (sBool == "1") bReturn = true;//1-0

            else if (sBool == "yes") bReturn = true;//yes-no

            else if (sBool == "y") bReturn = true;//y-n

            else if (sBool == "on") bReturn = true;//on-off