Почему в адресе boolean параметр показывается дважды?

189
26 июля 2019, 21:50

Это перевод вопроса Why does query string parameter get included twice - asp.net boolean

У меня есть страница со следующим кодом:

    <div class="editor-field">
        @Html.CheckBoxFor(model => model.IncludeArchive)
        @Html.ValidationMessageFor(model => model.IncludeArchive)
    </div>

Класс модели:

public class SearchModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string TestNumber { get; set; }
    public bool IncludeArchive { get; set; } 
}
    [Authorize]
    public ActionResult Index(SearchModel search)
    {
        var test= db.Test.AsQueryable();
        if (Request.QueryString.Count > 0) {
            if (!search.IncludeArchive) test = test.Where(x => x.Status == "Active");
        } else {
            test= test.Where(x => x.Status == "Active");
        }
        ViewBag.testList = test.ToList();

Когда я открываю страницу и затем выбираю чекбокс IncludeArchive строка адреса меняется на следующую:

http://localhost:64005/test/?FirstName=&LastName=&TestNumber=&IncludeArchive=true&IncludeArchive=false

Объясните, почему в url переменная IncludeArchive включается дважды?

Answer 1

Это не баг, это способ которым MVC фреймворк работает с чекбоксами.

Если вы обратите внимание на сгенерированную HTML-разметку вы увидите, что каждый чекбокс рендерится как html имеющий скрытое поле со значением равным false.

Это гарантирует, что при отправке формы будет передано значение false в случае если пользователь не отметит чекбокс.

Действительно, попробуйте провести следующий эксперимент. Поместите на форму такой чекбокс <input type="checkbox" name="MyTestCheckboxValue"></input> и посмотрите, какое значение уходит на сервер в случае, если чекбокс не отмечен. Вы увидите, что на сервер значение чекбокса не передаётся вообще.

Подобный трюк применяется также в Ruby on Rails и MonoRail.

См. также следующие вопросы:

  • https://stackoverflow.com/questions/2697299/asp-net-mvc-why-is-html-checkbox-generating-an-additional-hidden-input
  • https://stackoverflow.com/questions/2860940/asp-net-mvcwhy-does-the-checkboxfor-render-an-additional-input-tag-and-how-can
READ ALSO
Как сгладить UI и остальные объекты в Unity3D?

Как сгладить UI и остальные объекты в Unity3D?

Пытался сглаживать в Quality Anti Aliasing, но не помогает

195
Как скачать картинку с сайта?

Как скачать картинку с сайта?

Я пытаюсь сделать парсер на основе "AngleSharp"Я использую следующий код для скачивания:

285
Как пропускать пустые значения в INI файле?

Как пропускать пустые значения в INI файле?

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

162