MV3 Дубликаты Строковых Значений Запроса для CheckBox (true, false для логического значения) - PullRequest
14 голосов
/ 14 ноября 2011

Я создал довольно простую страницу с флажком:

@using (Html.BeginForm("MyController", "MyAction", FormMethod.Get))
{
  @Html.CheckBoxFor(x => x.MyCheckBox)
  <input type="submit" value="Go!" />      
}

URL заполняется значением MyCheckBox дважды !? Как таковой:

MyAction?MyCheckBox=true&MyCheckBox=false

Дублирует значение, только если флажок установлен в true. Если установлено значение false, оно будет отображаться только один раз в строке запроса.

Приведенный выше код упрощен, так как у меня есть пара раскрывающихся списков и текстовое поле в форме, которые работают нормально. Я не думаю, что есть что-то необычное в коде, который я исключил из этого вопроса.

У кого-нибудь была похожая проблема с дублирующимися параметрами строки запроса?

Ответы [ 3 ]

15 голосов
/ 14 ноября 2011

Такое поведение предусмотрено дизайном флажка. Стандартный элемент управления HTML-флажок не передает значения, если он не установлен. Это не интуитивно понятно. Вместо этого элемент управления флажка ASP.Net имеет 2 элемента: стандартный элемент управления, который является видимым, а также скрытый элемент управления со значением «False».

Поэтому, если флажок не установлен, будет передано одно значение: False.
Если этот флажок установлен, будет два значения: True и False. Поэтому вам нужно использовать следующий код для проверки правильности вашего кода:

bool checkboxChecked = Request.QueryString["MyCheckBox"].Contains("True");
3 голосов
/ 28 января 2014

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

MVC Html.CheckBox(...) и Html.CheckBoxFor(...) генерируют дополнительный ввод 'type = hidden' с тем же IDв качестве флажка управления, что приводит к дублированию параметров URL.Я решил эту проблему, просто добавив нужную разметку следующим образом:

@if(checkTrue){
    <input type="checkbox" id="MyCheckBox" name="MyCheckbox" checked="checked">
}else{
    <input type="checkbox" id="MyCheckBox" name="MyCheckbox">
}

Было бы лучше обернуть в помощник, чтобы использовать вместо кода MVC, чтобы проверка значения была инкапсулирована.

Как часть моего приложения, контроллер поддерживает наборы параметров запроса, используя как инъекцию формы, так и инжекцию ссылки с использованием помощников, чтобы сохранить состояние (например, элементов управления поиском / фильтрацией) при нажатии для навигации в пределах одной и той же области контроллера.В результате этой функции элемент флажка всегда устанавливается в значение false, если используются стандартные помощники MVC.Это хорошо, что я заметил и не потратил много времени на эту ошибку.

1 голос
/ 19 декабря 2016

В моей модели у меня была коллекция флажков примерно так:

public class PrerequisitesViewModel
{
    public List<StudentPrerequisiteStatusViewModel> PrerequisiteStatuses { get; set; }
}

public class StudentPrerequisiteStatusViewModel
{
    public long Id { get; set; }

    public string Name { get; set; }

    public bool IsSelected { get; set; }
}

Для того, чтобы все связалось правильно, мне пришлось фактически преобразовать значения из строки запроса и проанализировать их вручную с помощьюследующий код:

// fix for how MVC binds checkboxes... it send "true,false" instead of just true, so we need to just get the true
for (int i = 0; i < model.PrerequisiteStatuses.Count(); i++)
{
    model.PrerequisiteStatuses[i].IsSelected = bool.Parse((Request.QueryString[$"PrerequisiteStatuses[{i}].IsSelected"] ?? "false").Split(',')[0]);
}

Увы, это работает, но я не могу поверить, что это необходимо в MVC!Надеюсь, кто-то еще знает о лучшем решении.

...