CheckboxList в MVC3 Просмотр и получение проверенных элементов, передаваемых в контроллер
У меня есть класс для MoreInfo:
public class MoreInfo
{
public string Name { get; set; }
public string selectedCheckboxItems {get; set;}
}
Я хочу знать, как создать список флажков в представлении и передать проверенные элементы моему контроллеру при отправке.
Как мне создать список флажков и как передать все отмеченные элементы и обработать их?
3 ответа
Давайте немного изменим вашу модель:
public class ItemViewModel
{
public string Id { get; set; }
public string Name { get; set; }
public bool Checked { get; set; }
}
тогда вы можете иметь контроллер:
public class HomeController: Controller
{
public ActionResult Index()
{
// This action is used to render the form =>
// we should populate our model with some values
// which could obviously come from some data source
var model = new[]
{
new ItemViewModel { Id = "1", Checked = true, Name = "item 1" },
new ItemViewModel { Id = "2", Checked = false, Name = "item 2" },
new ItemViewModel { Id = "3", Checked = true, Name = "item 3" },
};
return View(model);
}
[HttpPost]
public ActionResult Index(IEnumerable<ItemViewModel> items)
{
// This action will be invoked when the form is submitted
// and here the view model will be properly bound and
// you will get a collection of all items with their
// corresponding id, name and whether they were checked or not
...
}
}
тогда у вас будет соответствующий вид (~/Views/Home/Index.cshtml
) который будет содержать форму, позволяющую пользователю проверять / снимать отметки со значений:
@model IEnumerable<AppName.Models.ItemViewModel>
@using (Html.BeginForm())
{
@Html.EditorForModel()
<input type="submit" value="OK" />
}
и наконец редактор шаблона (~/Views/Home/EditorTemplates/ItemViewModel.cshtml
):
@model AppName.Models.ItemViewModel
// Those two hidden fields are just to persist the id and name
@Html.HiddenFor(x => x.Id)
@Html.HiddenFor(x => x.Name)
<div>
@Html.CheckBoxFor(x => x.Checked)
@Html.LabelFor(x => x.Checked, Model.Name)
</div>
public class MoreInfo
{
public Int64 Id {get; set;}
public string Name { get; set; }
public bool Checkbox {get; set;}
}
Действие контроллера:
public ActionResult Index(){
var list = new List<MoreInfo>{
new MoreInfo{Id = 1, Name = "Name1", Checkbox = false},
new MoreInfo{Id = 2, Name = "Name2", Checkbox = false},
new MoreInfo{Id = 3, Name = "Name3", Checkbox = true},
};
return View(list);
}
[HttpPost]
public ActionResult Index(List<MoreInfo> lists){
return View(lists);
}
Razor View:
@model List<MoreInfo>
<form action="" method="POST">
@for (var i = 0; i < Model.Count();i++ )
{
@Html.HiddenFor(it => it[i].Id)
@Html.TextBoxFor(it => it[i].Name)
@Html.CheckBoxFor(it => it[i].Checkbox)
}
<input type="submit" />
</form>
Больше информации здесь
Это так просто:
1. создайте класс checkbox со строковым идентификатором и значением bool.
2. поставить список флажков в методе контроллера с некоторым именем.
3. Создайте 2 поля динамически в вашем представлении, но убедитесь, что вы соответствуете системе именования движка бритвы.
чтобы создать динамический список флажков, вы должны понимать, как работает бритва, скажем, у вас есть этот код
в заголовке представления вы включаете модель, например, так:
@model MyProject.Site.Models.MyWebModel
эта модель имеет класс установки, внутри которого есть логическое выражение, например:
public class MyWebModel
{
public HighchartsSettingModel Settings { get; set; }
}
public class HighchartsSettingModel
{
public bool JoinSameType{ get; set; }
}
и в представлении у вас есть:
@Html.CheckBoxFor(x => x.Settings.JoinSameType)
Короче говоря, это создает следующий HTML-код:
<input data-val="true" data-val-required="The JoinSameType field is required." id="Settings_JoinSameType" name="Settings.JoinSameType" type="checkbox" value="true" />
<input name="Settings.JoinSameType" type="hidden" value="false" />
пока что хорошо для CheckBoxFor, который является частью фреймворка, как мы работаем с массивами?
так что теперь все, что нам нужно сделать, это понять, как работать со списком в методе контроллера, скажем, у вас есть этот класс:
public class Checkbox{
public string Id { get; set; }
public bool Value { get; set; }
}
и в контроллере у вас есть это:
public ActionResult SensorSearch(List<Checkbox> selectedSensors, string search, string subSearch, string page, string back)
и вид будет выглядеть так:
@{
int counter = 0;
string id_name, id_id, value_id, value_name;
}
@foreach (var item in Model.SensorList)
{
id_id = "selectedSensors_" + counter + "__Value";
id_name = "selectedSensors[" + counter + "].Value";
value_id = "selectedSensors_" + counter + "__Id";
value_name = "selectedSensors[" + counter + "].Id";
counter++;
<li><a href="#" style="padding-top: 0px;padding-bottom: 0px;padding-right: 42px;padding-left: 0px;">
<label style="border-top-width: 0px;margin-top: 0px;border-bottom-width: 0px;margin-bottom: 0px;border-left-width: 0px;border-right-width: 0px;" data-corners="false">
<fieldset data-role="controlgroup" >
<input id="@id_id" name="@id_name" type="checkbox" value="true" />
<input id="@value_id" name="@value_name" type="hidden" value="@item.Key" />
<label for="@id_id" style="border-top-width: 0px;margin-top: 0px;border-bottom-width: 0px;margin-bottom: 0px;border-left-width: 0px;border-right-width: 0px;">
<label style="padding:10px 0px 0px 10px;">
<h3>@item.Key</h3>
<p>User Name: @item.Value</p>
</label>
</label>
</fieldset>
</label>
</a><a href="#" rel="external"></a>
</li>
}
</ul>
давайте не будем забывать форму в представлении:
@using (Html.BeginForm("SensorSearch", "Home", Model.PageNav.StayRouteValues, FormMethod.Post, new Dictionary<string, object>() { { "data-ajax", "false" }, { "id", "sensor_search_form" } }))
Теперь отображаемая страница будет выглядеть так в аспекте флажка:
<li><a href="#" style="padding-top: 0px;padding-bottom: 0px;padding-right: 42px;padding-left: 0px;">
<label style="border-top-width: 0px;margin-top: 0px;border-bottom-width: 0px;margin-bottom: 0px;border-left-width: 0px;border-right-width: 0px;" data-corners="false">
<fieldset data-role="controlgroup" >
<input id="selectedSensors_16__Value" name="selectedSensors[16].Value" type="checkbox" value="true" />
<input id="selectedSensors_16__Id" name="selectedSensors[16].Id" type="hidden" value="10141" />
<label for="selectedSensors_16__Value" style="border-top-width: 0px;margin-top: 0px;border-bottom-width: 0px;margin-bottom: 0px;border-left-width: 0px;border-right-width: 0px;">
<label style="padding:10px 0px 0px 10px;">
<h3>10141</h3>
<p>User Name: 10141_TEN-2MP</p>
</label>
</label>
</fieldset>
</label>
</a><a href="#" rel="external"></a>
</li>
что вы должны заметить, так это имена, заданные для input-checkbox и input-hidden, мы использовали его подобно тому, как движок бритвы создает имя, и поэтому после submit движок отобразит это как массив, и вы можете создать любой динамический флажок перечислите, где вы хотите то же самое, что и на любом другом языке (например, php и т. д.) .
это так легко: это так легко:
1. создайте класс checkbox со строковым идентификатором и значением bool.
2. поставить список флажков в методе контроллера с некоторым именем.
3. Создайте 2 поля динамически в вашем представлении, но убедитесь, что вы соответствуете системе именования движка бритвы.
Я надеялся, что это помогло.