Это перевод вопроса 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 включается дважды?
Это не баг, это способ которым MVC фреймворк работает с чекбоксами.
Если вы обратите внимание на сгенерированную HTML-разметку вы увидите, что каждый чекбокс рендерится как html имеющий скрытое поле со значением равным false.
Это гарантирует, что при отправке формы будет передано значение false в случае если пользователь не отметит чекбокс.
Действительно, попробуйте провести следующий эксперимент. Поместите на форму такой чекбокс <input type="checkbox" name="MyTestCheckboxValue"></input>
и посмотрите, какое значение уходит на сервер в случае, если чекбокс не отмечен.
Вы увидите, что на сервер значение чекбокса не передаётся вообще.
Подобный трюк применяется также в Ruby on Rails и MonoRail.
См. также следующие вопросы:
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пытался сглаживать в Quality Anti Aliasing, но не помогает
Я пытаюсь сделать парсер на основе "AngleSharp"Я использую следующий код для скачивания:
Подскажите как пропускать чтение пустых параметров из INI файла, чтобы при загрузке формы не выдавало ошибку - нет логического значения