Получение значения флажка в 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>
когда я отправляю форму, значение запоминания в модели всегда ложно. Однако свойство Name В модели имеет значение. Я проверил это, установив точку останова в следующем:
[HttpPost]
public ActionResult MyAction(MyModel model)
{
Console.WriteLine(model.Remember.ToString());
}
Я не могу понять это. Почему не устанавливается значение флажка?
18 ответов:
@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по моделиboolсвойства
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />это всегда будет отправлять значение по умолчанию, если установлен флажок.
Так как вы используете Model.Name чтобы установить значение. Я предполагаю, что вы передаете пустую модель представления в представление.
таким образом, значение для Remember равно false и устанавливает значение элемента checkbox в false. Это означает, что когда вы затем установите флажок, вы отправляете значение "false" с формой. Когда вы не выбираете его, он не публикуется, поэтому модель по умолчанию имеет значение false. Вот почему вы видите ложное значение в обоих случаях.
значение только передается при установке флажка выбрать. Чтобы сделать флажок в Mvc используйте
@Html.CheckBoxFor(x => x.Remember)или если вы не хотите привязывать модель к виду.
@Html.CheckBox("Remember")Mvc делает некоторую магию со скрытым полем для сохранения значений, когда они не выбраны.
Edit, если у вас действительно есть отвращение к этому и вы хотите создать элемент самостоятельно, вы можете это сделать.
<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked=\"checked\"" : "") />
используйте только это
$("input[type=checkbox]").change(function () { if ($(this).prop("checked")) { $(this).val(true); } else { $(this).val(false); } });
хорошо, флажок немного странно. Когда вы используете HTML helper, он генерирует два ввода флажка в разметке, и оба они передаются в качестве пары имя-значение IEnumerable, если он установлен.
если он не проверен на разметке, он передается только в скрытый вход, который имеет значение false.
Так например на разметке у вас есть:
@Html.CheckBox("Chbxs")и в действии контроллера (убедитесь, что имя совпадает с именем параметра param on контроллер):
public ActionResult Index(string param1, string param2, string param3, IEnumerable<bool> Chbxs)затем в контроллере вы можете сделать некоторые вещи, такие как:
if (Chbxs != null && Chbxs.Count() == 2) { checkBoxOnMarkup = true; } else { checkBoxOnMarkup = false; }Я знаю, что это не элегантное решение. Надеюсь, кто-то здесь может дать несколько советов.
вместо
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />использование:
@Html.EditorFor(x => x.Remember)это даст вам флажок специально для запомнить
чтобы преобразовать значение, возвращенное из флажка в форме, в логическое свойство, я использовал конвертер ValueProviderResult в build в пользовательском ModelBinder.
ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName"); bool value = (bool)cbValue.ConvertTo(typeof(bool));
я столкнулся с подобной проблемой и смог вернуть значение флажка, используя флажок, hiddenfor и маленький JQuery следующим образом:
@Html.CheckBox("isPreferred", Model.IsPreferred) @Html.HiddenFor(m => m.IsPreferred) <script> $("#isPreferred").change(function () { $("#IsPreferred").val($("#isPreferred").val()); }) </script>
Это была большая боль и чувствует, что это должно быть проще. Вот моя настройка и решение.
Я использую следующий HTML-помощник:
@Html.CheckBoxFor(model => model.ActiveFlag)затем, в контроллере, я проверяю сбор формы и обработку соответственно:
bool activeFlag = collection["ActiveFlag"] == "false" ? false : true; [modelObject].ActiveFlag = activeFlag;
@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); });
для 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); }
Я просто столкнулся с этим (я не могу поверить, что это не привязать вкл/выкл!)
в любом случае!
<input type="checkbox" name="checked" />опубликует значение "on"или " off".
этой не будет привязка к логическому, но вы можете сделать это глупое решение!
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; } }
для нескольких флажок с тем же именем... Код для удаления ненужного 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++; }
public ActionResult Index(string username, string password, string rememberMe) { if (!string.IsNullOrEmpty(username)) { bool remember = bool.Parse(rememberMe); //... } return View(); }
изменить запомнить вот так
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()); }
в моем случае я не устанавливал свойство модели "запомнить" в методе get. Проверьте свою логику в контроллере. Возможно, вы делаете то же самое. Я надеюсь, что это поможет!
если вы действительно хотите использовать простой 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, он фактически выводит два входа: флажок и скрытое поле, так что ложное значение отправляется, когда флажок снят (а не просто ничего). Это может вызвать некоторые неожиданные ситуации, например:
Я прочитал другие ответы и не совсем понял, что это работает - так вот решение, которое я получил.
моя форма использует
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); }
при работе с FormCollection, а не с моделью, назначение может быть таким же простым, как:
MyModel.Remember = fields["Remember"] != "false";
Comments