Почему Html.Checkbox («Visible») возвращает «true, false» в ASP.NET MVC 2? - PullRequest
25 голосов
/ 09 мая 2011

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

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

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

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

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

Ответы [ 7 ]

29 голосов
/ 09 мая 2011

Это потому, что помощник 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)
{
    ...
}
9 голосов
/ 20 марта 2012

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

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

2 голосов
/ 07 января 2016

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

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

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

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

Для аннулирования дублирующихся значений "true, false", когда CheckBox равен true

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

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

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

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

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

bool BoolValue = bool.Parse(sParam);

Держите это:

MyObject.SomeBoolValue = BoolValue;
2 голосов
/ 22 ноября 2012

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

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

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

сделать это

adslService.Visible = bool.Parse(collection["Visible"] != "false");
1 голос
/ 24 июня 2011

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

ВИД:

<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 не будет отправлять обратно значение поля, если флажок снят, но будет отправлять обратно, если оно установлено. Помощник добавляет скрытое поле после элемента управления флажком (значение «Ложь»). Если флажок установлен, источник показывает «флажок =« проверен »», если он не отмечен, он не отображается. Таким образом, если флажок = проверен, значение true передается обратно в контроллер. Если флажок снят, управление не передается обратно, поэтому скрытое поле, названное так же, вступает во владение и возвращает ложное значение. Таким образом, у вас есть оба условия. Странно, но это работает. Надеюсь, это поможет.

0 голосов
/ 06 июля 2017

У меня уже есть статическая функция, которую я использую повсеместно для обработки текста логического типа и возврата 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
0 голосов
/ 18 мая 2017

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

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

Это может звучать глупо, но сэкономит кому-то время, чем бегать после обходов. Это предотвратит создание флажка с использованием расширения MVC

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