HTML. CheckBox делает что-то странное - при просмотре источника на получающейся странице Вы будете видеть, что существует <input type="hidden" />
сгенерированный вместе с каждым флажком, который объясняет "истинные ложные" значения, Вы видите каждый элемент формы.
Попытка это, которое определенно работает над ASP.NET Бета MVC, потому что я только что попробовал его.
Помещенный это в представление вместо того, чтобы использовать HTML. CheckBox ():
<% using (Html.BeginForm("ShowData", "Home")) { %>
<% foreach (var o in ViewData.Model) { %>
<input type="checkbox" name="selectedObjects" value="<%=o.Id%>">
<%= o.Name %>
<%}%>
<input type="submit" value="Submit" />
<%}%>
Ваши флажки все называют selectedObjects
, и value
из каждого флажка GUID соответствующего объекта.
Тогда сообщение к следующему действию контроллера (или что-то подобное, которое делает что-то полезное вместо Ответа. Запишите ())
public ActionResult ShowData(Guid[] selectedObjects) {
foreach (Guid guid in selectedObjects) {
Response.Write(guid.ToString());
}
Response.End();
return (new EmptyResult());
}
, Этот пример просто запишет GUID флажков, которые Вы установили; ASP.NET MVC отображает значения GUID установленных флажков в Guid[] selectedObjects
параметр для Вас, и даже анализирует строки от Запроса. Набор формы в instantied объекты GUID, которые я думаю, довольно хорош.
Вот то, что я делал.
Представление:
<input type="checkbox" name="applyChanges" />
Контроллер:
var checkBox = Request.Form["applyChanges"];
if (checkBox == "on")
{
...
}
я нашел HTML.* вспомогательные методы, не настолько полезные в некоторых случаях, и что я был более обеспеченным выполнением его в простом HTML. Этот являющийся одним из них, другой, который приходит на ум, является переключателями.
Редактирование: это находится на Предварительном просмотре 5, очевидно, YMMV между версиями.
Необходимо также использовать <label for="checkbox1">Checkbox 1</label>
, потому что затем люди могут нажать на текст метки, а также сам флажок. Его также легче разработать и по крайней мере в IE это будет выделено, когда Вы снабдите вкладками посредством средств управления страницы.
<%= Html.CheckBox("cbNewColors", true) %><label for="cbNewColors">New colors</label>
Это не просто, 'о, я мог сделать это' вещь. Это - значительное пользовательское улучшение опыта. Даже если не все пользователи будут знать, что они могут нажать на маркировку, то многие будут.
В случае, если Вы задаетесь вопросом, ПОЧЕМУ они вставляют скрытое поле с тем же именем как флажок, причина следующие:
Комментарий из исходного кода MVCBetaSource\MVC\src\MvcFutures\Mvc \ Рендеринг ButtonsAndLinkExtensions.cs
еще
<input type="hidden".../>
для флажков. Это обращается к сценариям, куда флажки непроверенные не отправляются в запросе. Отправка скрытого входа позволяет знать, что флажок присутствовал на странице, когда запрос был отправлен.
я предполагаю негласно, что они должны знать это для привязки к параметрам на методах действия контроллера. У Вас могла затем быть булевская переменная с тремя состояниями, которую я предполагаю (связанный с nullable bool параметром). Я не попробовал его, но я надеюсь, что это - то, что они сделали.
HtmlHelper добавляет скрытый вход для уведомления контроллера о состоянии Unchecked. Таким образом иметь корректное проверенное состояние:
bool bChecked = form[key].Contains("true");
Эта проблема происходит в выпуске 1.0 также. HTML.Checkbox () вызывает добавление другое скрытое поле с тем же именем / идентификатором, что и ваш оригинальный флажок. И, как я пытался загрузки массива флажков с помощью документа. GTELEMTENTENTSBYNAMENAME (), вы можете догадаться, как все становится запутанным. Это странная.
Я также хотел бы отметить, что вы можете присвоить каждому флажку другое имя, и это имя будет частью параметров actionresults.
Пример,
Представление:
<%= Html.CheckBox("Rs232CheckBox", false, new { @id = "rs232" })%>RS-232
<%= Html.CheckBox("Rs422CheckBox", false, new { @id = "rs422" })%>RS-422
Контроллер:
public ActionResults MyAction(bool Rs232CheckBox, bool Rs422CheckBox) {
...
}
Значения из представления передаются действию, поскольку имена совпадают.
Я знаю, что это решение не идеально для вашего проекта, но подумал, что выскажу эту идею.
Похоже, они предпочитают читать только первое значение, поэтому это «истина», когда флажок установлен, и «ложь», когда только скрытые значение включено. Это легко получить с помощью такого кода:
model.Property = collection["ElementId"].ToLower().StartsWith("true");
@ Дилан Битти Отличная находка !!! Большое спасибо. Чтобы расширить еще больше, этот метод также отлично работает с подходом модели представления. MVC настолько крут, что он достаточно умен, чтобы привязать массив Guids к свойству с тем же именем, что и объект Model, привязанный к View. Пример:
ViewModel:
public class SampleViewModel
{
public IList<SampleObject> SampleObjectList { get; set; }
public Guid[] SelectedObjectIds { get; set; }
public class SampleObject
{
public Guid Id { get; set; }
public string Name { get; set; }
}
}
View:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Sample View</h2>
<table>
<thead>
<tr>
<th>Checked</th>
<th>Object Name</th>
</tr>
</thead>
<% using (Html.BeginForm()) %>
<%{%>
<tbody>
<% foreach (var item in Model.SampleObjectList)
{ %>
<tr>
<td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
<td><%= Html.Encode(item.Name)%></td>
</tr>
<% } %>
</tbody>
</table>
<input type="submit" value="Submit" />
<%}%>
Controller:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult SampleView(Guid id)
{
//Object to pass any input objects to the View Model Builder
BuilderIO viewModelBuilderInput = new BuilderIO();
//The View Model Builder is a conglomerate of repositories and methods used to Construct a View Model out of Business Objects
SampleViewModel viewModel = sampleViewModelBuilder.Build(viewModelBuilderInput);
return View("SampleView", viewModel);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SampleView(SampleViewModel viewModel)
{
// The array of Guids successfully bound to the SelectedObjectIds property of the View Model!
return View();
}
Любой, кто знаком с философией View Model, обрадуется, это работает как Champ!
<input type = "checkbox" name = "checkbox1" /> <label> Check to say hi.</label>
Из контроллера:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection fc)
{
var s = fc["checkbox1"];
if (s == "on")
{
string x = "Hi";
}
}