Получение значения Checkbox в ASP.NET MVC 4
Я работаю над приложением ASP.NET MVC 4. Это приложение имеет базовую форму. Модель для моей формы выглядит следующим образом:
public class MyModel
{
public string Name { get; set; }
public bool Remember { get; set; }
}
В моей форме у меня есть следующий HTML.
<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember"> Remember Me?</label>
Когда я отправляю форму, значение Remember в модели всегда ложно. Однако свойство Name в модели имеет значение. Я проверил это, установив точку останова в следующем:
[HttpPost]
public ActionResult MyAction(MyModel model)
{
Console.WriteLine(model.Remember.ToString());
}
Я не могу понять. Почему значение Checkbox не установлено?
Ответы
Ответ 1
@Html.EditorFor(x => x.Remember)
Будет генерировать:
<input id="Remember" type="checkbox" value="true" name="Remember" />
<input type="hidden" value="false" name="Remember" />
Как это работает:
- Если
checkbox
не установлен, форма отправляет только hidden
значение (false) - Если флажок установлен, то форма отправляет два поля (false и true), а MVC устанавливает значение
true
для свойства model bool
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember"/>
Это всегда будет отправлять значение по умолчанию, если отмечено.
Ответ 2
Поскольку вы используете Model.Name для установки значения. Я предполагаю, что вы передаете пустую модель представления в представление.
Итак, значение для Remember является false и устанавливает значение в элементе checkbox равным false. Это означает, что, когда вы затем установите флажок, вы публикуете значение "false" с формой. Если вы его не выбрали, он не будет отправлен, поэтому для модели по умолчанию используется значение false. Вот почему вы видите ложное значение в обоих случаях.
Значение передается только при проверке поля выбора. Чтобы сделать флажок в Mvc, используйте
@Html.CheckBoxFor(x => x.Remember)
или если вы не хотите привязывать модель к виду.
@Html.CheckBox("Remember")
Mvc делает магию со скрытым полем для сохранения значений, когда они не выбраны.
Изменить, если у вас действительно есть отвращение к этому, и вы хотите создать элемент самостоятельно, вы можете сделать.
<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked=\"checked\"" : "") />
Ответ 3
Используйте только этот
$("input[type=checkbox]").change(function () {
if ($(this).prop("checked")) {
$(this).val(true);
} else {
$(this).val(false);
}
});
Ответ 4
Хорошо, флажок немного странный.
Когда вы используете хелпер Html, он генерирует два входа checkbox в разметке, и оба они передаются в качестве пары имя-значение IEnumerable, если она проверена.
Если он не проверяется на разметке, он передается только в скрытом входе, значение которого имеет значение false.
Так, например, на разметке у вас есть:
@Html.CheckBox("Chbxs")
И в действии контроллера (убедитесь, что имя соответствует флажку param name на контроллере):
public ActionResult Index(string param1, string param2,
string param3, IEnumerable<bool> Chbxs)
Затем в контроллере вы можете сделать что-то вроде:
if (Chbxs != null && Chbxs.Count() == 2)
{
checkBoxOnMarkup = true;
}
else
{
checkBoxOnMarkup = false;
}
Я знаю, что это не изящное решение. Надеюсь, что кто-то здесь может дать некоторые указатели.
Ответ 5
Вместо
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
использование:
@Html.EditorFor(x => x.Remember)
Это даст вам флажок специально для "Запомнить"
Ответ 6
Чтобы преобразовать значение, возвращенное из флажка в форме, к логическому свойству, я использовал ValueProviderResult в конвертере сборки в пользовательском ModelBinder.
ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName");
bool value = (bool)cbValue.ConvertTo(typeof(bool));
Ответ 7
Я столкнулся с подобной проблемой и смог вернуть значение флажка, используя флажок, скрытый и маленький JQuery:
@Html.CheckBox("isPreferred", Model.IsPreferred)
@Html.HiddenFor(m => m.IsPreferred)
<script>
$("#isPreferred").change(function () {
$("#IsPreferred").val($("#isPreferred").val());
})
</script>
Ответ 8
Это была большая боль, и она чувствует, что это должно быть проще. Здесь моя настройка и решение.
Я использую следующий HTML-помощник:
@Html.CheckBoxFor(model => model.ActiveFlag)
Затем в контроллере я проверяю сбор и обработку формы соответственно:
bool activeFlag = collection["ActiveFlag"] == "false" ? false : true;
[modelObject].ActiveFlag = activeFlag;
Ответ 9
@Html.EditorFor(x => x.ShowComment)
$(function () {
// set default value to control on document ready instead of 'on'/'off'
$("input[type='checkbox'][name='ShowComment']").val(@Model.ShowComment.ToString().ToLower());
});
$("#ShowComment").change(function() {
// this block sets value to checkbox control for "true" / "false"
var chkVal = $("input[type='checkbox'][name='ShowComment']").val();
if (chkVal == 'false') $("input[type='checkbox'][name='ShowComment']").val(true);
else $("input[type='checkbox'][name='ShowComment']").val(false);
});
Ответ 10
Для MVC с использованием модели.
Модель:
public class UserInfo
{
public string UserID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public bool RememberMe { get; set; }
}
HTML:
<input type="checkbox" value="true" id="checkbox1" name="RememberMe" checked="@Model.RememberMe"/>
<label for="checkbox1"></label>
В функции [HttpPost] мы можем получить его свойства.
[HttpPost]
public ActionResult Login(UserInfo user)
{
//...
return View(user);
}
Ответ 11
Я просто столкнулся с этим (я не могу поверить, что он не связан вкл/выкл!)
В любом случае!
<input type="checkbox" name="checked" />
Выведет значение "on" или "off".
Этот WONT связывается с логическим, но вы можете сделать это глупое обходное решение!
public class MyViewModel
{
/// <summary>
/// This is a really dumb hack, because the form post sends "on" / "off"
/// </summary>
public enum Checkbox
{
on = 1,
off = 0
}
public string Name { get; set; }
public Checkbox Checked { get; set; }
}
Ответ 12
Для нескольких флажков с тем же именем... Код для удаления ненужного false:
List<string> d_taxe1 = new List<string>(Request.Form.GetValues("taxe1"));
d_taxe1 = form_checkbox.RemoveExtraFalseFromCheckbox(d_taxe1);
Функция
public class form_checkbox
{
public static List<string> RemoveExtraFalseFromCheckbox(List<string> val)
{
List<string> d_taxe1_list = new List<string>(val);
int y = 0;
foreach (string cbox in val)
{
if (val[y] == "false")
{
if (y > 0)
{
if (val[y - 1] == "true")
{
d_taxe1_list[y] = "remove";
}
}
}
y++;
}
val = new List<string>(d_taxe1_list);
foreach (var del in d_taxe1_list)
if (del == "remove") val.Remove(del);
return val;
}
}
Используйте его:
int x = 0;
foreach (var detail in d_prix){
factured.taxe1 = (d_taxe1[x] == "true") ? true : false;
x++;
}
Ответ 13
public ActionResult Index(string username, string password, string rememberMe)
{
if (!string.IsNullOrEmpty(username))
{
bool remember = bool.Parse(rememberMe);
//...
}
return View();
}
Ответ 14
Изменить Помните, как это
public class MyModel
{
public string Name { get; set; }
public bool? Remember { get; set; }
}
Используйте nullable bool в контроллере и отмените значение false на null, как этот
[HttpPost]
public ActionResult MyAction(MyModel model)
{
model.Remember = model.Remember ?? false;
Console.WriteLine(model.Remember.ToString());
}
Ответ 15
В моем случае я не устанавливал свойство модели "Запомнить" в методе get. Проверьте свою логику в контроллере. Вы можете делать то же самое. Надеюсь, эта помощь!
Ответ 16
Если вы действительно хотите использовать простой HTML (по любой причине), а не встроенные расширения HtmlHelper, вы можете сделать это следующим образом.
Вместо
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
попробуйте использовать
<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked" : "") />
Входные данные флажка в HTML работают так, что когда они проверены, они отправляют значение, а когда они не проверены, они вообще ничего не отправляют (что приведет к откату ASP.NET MVC к значению по умолчанию поле, false
). Кроме того, значение флажка в HTML может быть чем угодно, не просто true/false, поэтому, если вы действительно хотите, вы можете даже использовать флажок для строкового поля в вашей модели.
Если вы используете встроенный Html.RenderCheckbox
, он фактически выводит два ввода: флажок и скрытое поле, так что ложное значение отправляется, когда флажок снят (не просто ничего). Это может вызвать некоторые неожиданные ситуации, например:
Ответ 17
Я прочитал другие ответы и не смог заставить его работать - вот решение, которое я выбрал.
Моя форма использует Html.EditorFor(e => e.Property)
для создания флажка, и, используя FormCollection
в контроллере, он передает строковое значение 'true,false'
в контроллере.
Когда я обрабатываю результаты, я использую цикл для их циклического просмотра - я также использую экземпляр InfoProperty
для представления значения текущей модели, оцениваемого из формы.
Поэтому вместо этого я просто проверяю, начинается ли возвращаемая строка со слова 'true'
а затем устанавливаю логическую переменную в значение " true
и передаю ее в возвращаемую модель.
if (KeyName.EndsWith("OnOff"))
{
// set on/off flags value to the model instance
bool keyTrueFalse = false;
if(values[KeyName].StartsWith("true"))
{
keyTrueFalse = true;
}
infoProperty.SetValue(processedInfo, keyTrueFalse);
}
Ответ 18
При работе с FormCollection, а не с моделью, назначение может быть таким простым:
MyModel.Remember = fields["Remember"] != "false";
Ответ 19
У меня есть вопросник, на первой странице, если пользователь устанавливает флажок (генерируется с помощью кода ниже) @Html.CheckBoxFor(x => x.markforreview, Model.markforreview) Отметить для просмотра
на следующей странице это не должно быть проверено, и когда пользователь возвращается к предыдущему, это должно быть проверено. ничего не работает, при отладке представления показывает, что все выполняется правильно, но когда страница отображается, флажок для любого вопроса, который проходит пользователь... Я не знаю, почему не работает этот помощник html, я попробовал все.