Флажок всегда передает истинное значение контроллеру MVC .Net - PullRequest
0 голосов
/ 19 марта 2019

Я использую флажок для разрешения функции заказа, которая генерирует HTML-код ниже:

@using (Html.BeginForm("EditFarm", "CustomerManagement", FormMethod.Post))
{
  @Html.AntiForgeryToken()
  @Html.ValidationSummary(true)
  @Html.HiddenFor(model => model.AllowOrder)

 <div>
   <label for="allowOrder">Allow Ordering</label>
   <br />
   <input type="checkbox" id="allowOrder" name="AllowOrder" value="true" @(Model.AllowOrder ? "checked" : "") />
 </div>
....
}

Проблема в том, что флажок AllowerOrder всегда передает значение true в контроллер, даже если оно unchecked

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

public ActionResult EditFarm([Bind(Include = "Id, ERPCustomerCode, ERPId, CategoryId, Size, Large, OtherId, AllowOrder")] NewFarm farm)
        {
           ...
        }

Попробовал отладку, полученная модель всегда имеет AllowerOrder = true. enter image description here

Есть ли проблема в моем коде? Любая помощь будет оценена! Спасибо!

1 Ответ

1 голос
/ 19 марта 2019

Наиболее вероятная причина - привязка к свойству AllowOrder с помощью помощника HiddenFor перед использованием <input type="checkbox" />, который будет генерировать элементы ввода в следующем порядке:

<input name="AllowOrder" type="hidden" ... />

<input type="checkbox" id="allowOrder" name="AllowOrder" value="true" ... />

Поскольку есть 2 входных элемента с одинаковым значением атрибута name, только первый элемент <input> будет привязан к свойству viewmodel, которое содержит значение true в вашем случае. Вместо того, чтобы создавать флажок вручную с тегом <input> и скрытым полем по отдельности, вы должны использовать атрибут @Html.CheckBoxFor() helper и переключать атрибут checked с помощью вспомогательной функции ниже или использовать троичный оператор:

public object SetChecked(bool value)
{
    if (value)
    {
        return new { id = "allowOrder", @checked = "checked" };
    }
    else
    {
        return new { id = "allowOrder" };
    }
}

Checkbox

@* alternative 1 *@

@Html.CheckBoxFor(model => model.AllowOrder, @(SetChecked(Model.AllowOrder)))

@* alternative 2 *@

@Html.CheckBoxFor(model => model.AllowOrder, new { id = "allowOrder", @checked = @(Model.AllowOrder ? "checked" : "") })

Примечание: checked является ключевым словом C #, поэтому его необходимо экранировать с помощью @, чтобы установить его как атрибут HTML для визуализированного <input type="checkbox" />.

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