почему флажок всегда верный - PullRequest
4 голосов
/ 11 февраля 2012

Я использую @Html.CheckBoxFor(x => x.Luxury)

, который генерирует следующий HTML

<input id="Luxury" type="checkbox" value="true" name="Luxury" data-val-required="The Luxury field is required." data-val="true">
<input type="hidden" value="true" name="Luxury">

Поэтому, независимо от того, что я установил флажок, действие контроллеров получает значение как ИСТИНА, даже если не отмечено.

Как заставить MVC не устанавливать флажок, возвращающий true. Когда я отлаживаю первый Brace еще до вызова какого-либо кода, я вижу Banner.Luxury всегда = true

Мой класс

   public class Banner
   {
         public int Id { get; set; }
         public bool Luxury { get; set; }
   }



[HttpPost]
public ActionResult Save(Banner banner)

       ....
}

Глядя на этот вопрос Почему ASP.NET MVC Html.CheckBox выводит два INPUT с одинаковым именем? не помогает, как при запуске

Convert.ToBoolean(Request.Form.GetValues("Luxury"));

Существует только "правда", а не "правда; ложь";

Этот обходной путь работает, но это плохой HACK

 @{      if (Model.Luxury)
         {
                 <input type="checkbox" name="Luxury" value="1" checked="checked" />
         }
         else
         {
                  <input type="checkbox" name="Luxury" value="1" />
         }
   }

код

 banner.Luxury = !(Request.Form.GetValues("Luxury") == null);

Ответы [ 2 ]

0 голосов
/ 11 февраля 2012

Недостаточно места в комментарии. Вы говорите, CheckBoxFor выводит этот код:

<input type="hidden" value="true" name="Luxury">

Мне очень трудно понять, как это происходит, учитывая, что код для генерации этого вспомогательного поля выглядит следующим образом (в InputHelper, вызываемом CheckBoxHelper, вызываемым CheckBoxFor):

if (inputType == InputType.CheckBox) {
    StringBuilder inputItemBuilder = new StringBuilder();
    inputItemBuilder.Append(tagBuilder.ToString(TagRenderMode.SelfClosing));

    TagBuilder hiddenInput = new TagBuilder("input");
    hiddenInput.MergeAttribute("type", 
       HtmlHelper.GetInputTypeString(InputType.Hidden));
    hiddenInput.MergeAttribute("name", fullName);
    hiddenInput.MergeAttribute("value", "false"); // <-- Notice this
    inputItemBuilder.Append(hiddenInput.ToString(TagRenderMode.SelfClosing));
    return MvcHtmlString.Create(inputItemBuilder.ToString());
}

Обратите внимание, что он явно устанавливает value в значение "false" - он не получает значение для скрытого поля откуда-либо Поэтому, если у вас нет собственного CheckBoxFor метода - или каких-то других махинаций, - я не понимаю, как это могло бы стать «правдой».

Но да, если этот «скрытый» ввод равен «истина», Luxury всегда будет истинным.

Когда флажок установлен, значение флажка - и скрытое значение, которое MVC будет игнорировать - отправляется (Luxury=true&Luxury=true - или эквивалент POST).

Если этот флажок снят, отправляется только скрытое значение (Luxury=true).

Вот почему скрытый ввод должен быть false - так что Luxury=false отправляется, когда флажок снят. Опять же, вопрос в том, почему не это false?

Объяснение этому лежит где-то в вашем коде, которого мы не видели.

0 голосов
/ 11 февраля 2012

Измените его на:

<input type="hidden" value="false" name="Luxury">
<input id="Luxury" type="checkbox" value="true" name="Luxury" data-val-required="The Luxury field is required." data-val="true">

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

В вашем примере, даже если вы изменили порядок, вы всегда возвращали true.

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