Внимание: этому вопросу больше девяти лет!
Лучше всего искать новые вопросы или искать ответы ниже, чтобы найти конкретную версию MVC, так как многие ответы здесь устарели.
Если вы найдете ответ, который подходит для вашей версии, убедитесь, что он содержит версию MVC, которую вы используете.
(Оригинальный вопрос начинается ниже)
Это кажется мне немного странным, но, насколько я могу судить, именно так вы и делаете.
У меня есть коллекция объектов, и я хочу, чтобы пользователи выбирали один или несколько из них. Это говорит мне "форма с флажками". Мои объекты не имеют никакого понятия «выбранный» (они элементарные POCO, сформированные десериализацией вызова wcf). Итак, я делаю следующее:
public class SampleObject{
public Guid Id {get;set;}
public string Name {get;set;}
}
По мнению:
<%
using (Html.BeginForm())
{
%>
<%foreach (var o in ViewData.Model) {%>
<%=Html.CheckBox(o.Id)%> <%= o.Name %>
<%}%>
<input type="submit" value="Submit" />
<%}%>
И в контроллере это единственный способ увидеть, какие объекты проверял пользователь:
public ActionResult ThisLooksWeird(FormCollection result)
{
var winnars = from x in result.AllKeys
where result[x] != "false"
select x;
// yadda
}
Во-первых, это причудливо, а во-вторых, для тех элементов, которые проверял пользователь, FormCollection отображает его значение как «истинное ложное», а не просто истинное.
Очевидно, я что-то упустил. Я думаю, что это построено с мыслью о том, что объекты в коллекции, которые UpdateModel()
обрабатываются в html-форме, обновляются с помощью или через ModelBinder.
Но мои объекты не созданы для этого; Значит ли это, что это единственный путь? Есть ли другой способ сделать это?
источник
Ответы:
Html.CheckBox делает что-то странное - если вы посмотрите на исходную страницу источник, вы увидите,
<input type="hidden" />
что рядом с каждым флажком генерируется существо, которое объясняет «истинные ложные» значения, которые вы видите для каждого элемента формы.Попробуйте это, что определенно работает на ASP.NET MVC Beta, потому что я только что попробовал.
Поместите это в представление вместо использования Html.CheckBox ():
Все ваши флажки вызываются
selectedObjects
, иvalue
каждый из них является GUID соответствующего объекта.Затем опубликуйте следующее действие контроллера (или нечто подобное, что делает что-то полезное вместо Response.Write ())
Этот пример просто напишет GUID блоков, которые вы отметили; ASP.NET MVC отображает значения GUID выбранных флажков в
Guid[] selectedObjects
параметр для вас и даже анализирует строки из коллекции Request.Form в экземпляры объектов GUID, что, на мой взгляд, довольно неплохо.источник
HtmlHelper добавляет скрытый ввод для уведомления контроллера о статусе Unchecked. Итак, чтобы иметь правильный проверенный статус:
источник
Если вам интересно, ПОЧЕМУ они вставили скрытое поле с тем же именем, что и флажок, причина заключается в следующем:
Комментарий из исходного кода MVCBetaSource \ MVC \ src \ MvcFutures \ Mvc \ ButtonsAndLinkExtensions.cs
Я думаю, что за кулисами они должны знать это для привязки к параметрам методов действия контроллера. Я полагаю, вы могли бы иметь логическое значение в трех состояниях (связанное с параметром типа null). Я не пробовал это, но я надеюсь, что вот что они сделали.
источник
Вы также должны использовать,
<label for="checkbox1">Checkbox 1</label>
потому что тогда люди могут нажать на текст метки, а также сам флажок. Его также легче стилизовать, и, по крайней мере, в IE он будет выделен при переходе по элементам управления страницы.Это не просто «о, я мог бы сделать это». Это значительное улучшение пользовательского опыта. Даже если не все пользователи знают, что они могут нажать на ярлык, многие будут.
источник
Я удивлен, что ни один из этих ответов не использовал встроенные функции MVC для этого.
Я написал пост в блоге об этом здесь , который даже связывает ярлыки с флажком. Я использовал папку EditorTemplate, чтобы сделать это простым и модульным способом.
Вы просто получите новый файл в папке EditorTemplate, который выглядит следующим образом:
на самом деле, вам не нужно будет зацикливаться, просто 1 строка кода:
Посетите мой блог для более подробной информации.
источник
+1
и + пивоВот что я делал.
Посмотреть:
контроллер:
Я нашел вспомогательные методы Html. * В некоторых случаях не очень полезными, и мне было бы лучше делать это в простом старом HTML. Это один из них, другой, который приходит на ум, это радио кнопки.
Изменить: это в Preview 5, очевидно, YMMV между версиями.
источник
Похоже, что они выбирают чтение только первого значения, поэтому это «true», когда флажок установлен, и «false», когда включено только скрытое значение. Это легко получить с помощью следующего кода:
источник
@ Дилан Битти Отличная находка !!! Большое спасибо Чтобы расширить еще больше, этот метод также прекрасно работает с подходом View Model. MVC настолько крут, что достаточно умен, чтобы привязать массив Guids к свойству с тем же именем объекта Model, привязанного к View. Пример:
ViewModel:
Посмотреть:
контроллер:
Любой, кто знаком с философией View Model, будет рад, это работает как Champ!
источник
Я также хотел бы отметить, что вы можете присвоить каждому флажку свое имя и включить его в параметры actionresults.
Пример,
Посмотреть:
контроллер:
Значения из представления передаются действию, поскольку имена совпадают.
Я знаю, что это решение не идеально подходит для вашего проекта, но я подумал, что я бы предложил эту идею.
источник
Из контроллера:
источник
Эта проблема также возникает в выпуске 1.0. Html.Checkbox () вызывает добавление еще одного скрытого поля с тем же именем / идентификатором, что и у исходного флажка. И когда я пытался загрузить массив флажков с помощью document.GetElemtentsByName (), вы можете догадаться, как все было испорчено. Это странно.
источник
Из того, что я могу собрать, модель не хочет угадывать, был ли флажок = true или false, я обошел это, установив атрибут value для элемента checkbox с помощью jQuery перед отправкой формы следующим образом:
Таким образом, вам не нужен скрытый элемент только для хранения значения флажка.
источник
Я знаю, что этот вопрос был написан, когда MVC3 не было, но для любого, кто приходит к этому вопросу и использует MVC3, вы можете захотеть «правильный» способ сделать это.
Пока думаю, что занимаюсь всем
вещь отличная и чистая, и работает на всех версиях MVC, проблема в том, что она не учитывает культуру (как будто это действительно имеет значение в случае bool).
«Правильный» способ выяснить значение bool, по крайней мере в MVC3, заключается в использовании ValueProvider.
Я делаю это на одном из сайтов моего клиента при редактировании разрешений:
Теперь, прелесть этого в том, что вы можете использовать это с любым простым типом, и это будет даже правильно на основе культуры (например, деньги, десятичные дроби и т. Д.).
ValueProvider - это то, что используется при формировании ваших действий следующим образом:
но когда вы пытаетесь динамически построить эти списки и проверить значения, вы никогда не узнаете Id во время компиляции, поэтому вам придется обрабатывать их на лету.
источник
Самый простой способ сделать это так ...
Вы устанавливаете имя и значение.
<input type="checkbox" name="selectedProducts" value="@item.ProductId" />@item.Name
Затем при отправке захватите значения флажков и сохраните их в массиве int. тогда соответствующая функция LinQ. Это оно..
источник
То же, что и ответ nautic20, просто используйте список флажков привязки модели MVC по умолчанию с тем же именем, что и у свойства коллекции string / int / enum во ViewModel. Вот и все.
Но одну проблему нужно указать. В каждом компоненте флажка не следует указывать «Id», который повлияет на привязку модели MVC.
Следующий код будет работать для привязки модели:
Следующие коды не будут привязаны к модели (разница здесь в том, что для каждого флажка назначен идентификатор)
источник
это то, что я сделал, чтобы потерять двойные значения при использовании Html.CheckBox (...
с 4-мя флажками, не отмеченными, не проверенными, проверенными, становится ли true, false, false, false, true, false в true, false, false, true. только то, что мне нужно
источник
Как насчет этого?
источник
При использовании флажка HtmlHelper я предпочитаю работать с опубликованными данными формы флажка в виде массива. Я действительно не знаю почему, я знаю, что другие методы работают, но я думаю, что я просто предпочитаю рассматривать строки, разделенные запятыми, как массив, насколько это возможно.
Таким образом, выполнение проверенного или истинного теста будет:
Выполнение ложной проверки будет:
Основное отличие заключается в использовании, так
GetValues
как это возвращает в виде массива.источник
Просто сделайте это на
$(document).ready
:источник
Мое решение:
Больше вы можете найти здесь: http://www.blog.mieten.pl/2010/12/asp-net-mvc-custom-checkbox-as-solution-of-string-was-not-recognized-as-a- действительный-логический /
источник
У меня была почти такая же проблема, но возвращаемое значение моего контроллера было заблокировано другими значениями.
Нашел простое решение, но оно кажется немного грубым.
Попробуйте ввести
Viewbag.
свой контроллер, и теперь вы даете ему имя, какViewbag.Checkbool
Теперь переключитесь на View и попробуйте это
@Viewbag.Checkbool
с этим, вы получите значение из контроллера.Параметры моего контроллера выглядят так:
и мой флажок будет обновляться так:
источник
Используя @mmacaulay, я придумал это для bool:
Если отмечено активно = true
Если флажок не активен = false
источник