Это перевод вопроса 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.
См. также следующие вопросы:
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости