MVC3中的CheckboxList查看并获取传递给控制器的选中项
我有一个MoreInfo类:
public class MoreInfo { public string Name { get; set; } public string selectedCheckboxItems {get; set;} }
我想知道如何在视图上创buildcheckbox列表,并在提交时将选中的项目传递给我的控制器。
我将如何去创buildcheckbox列表,以及如何通过所有选中的项目并处理它们?
让我们稍微修改你的模型:
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); }
剃刀视图:
@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.用stringid和布尔值创buildcheckbox类。
2.把控制器方法中的checkbox列表放在一些名字里。
3.在视图中dynamic创build2个字段,但要确保符合razor引擎命名系统。
要创build一个dynamic的checkbox列表,你需要了解剃刀引擎的工作方式,说你有这个代码
在视图的头部你包含一个模型,如下所示:
@model MyProject.Site.Models.MyWebModel
该模型有一个设置类,里面有一个bool:
public class MyWebModel { public HighchartsSettingModel Settings { get; set; } } public class HighchartsSettingModel { public bool JoinSameType{ get; set; } }
在视图中你有:
@Html.CheckBoxFor(x => x.Settings.JoinSameType)
总之这会创build下面的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来说非常好,这是框架的一部分,我们如何处理数组?
所以现在我们所要做的就是了解如何在控制器方法中使用list,比如说你有这个类:
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" } }))
现在在checkbox方面呈现的页面将如下所示:
<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>
你需要注意的是inputcheckbox的名称和input隐藏我们使用类似于razor引擎创build名称的方式,所以在提交引擎后,将把它渲染为一个数组,所以你可以创build任何dynamiccheckbox列出你想要什么,就像你会在任何其他语言(说PHP等…)。
它很容易:它很容易:
1.用stringid和布尔值创buildcheckbox类。
2.把控制器方法中的checkbox列表放在一些名字里。
3.在视图中dynamic创build2个字段,但要确保符合razor引擎命名系统。
我希望它帮助。
- 如何用ASP.Net MVC制作一个向导
- 未find方法:'!! 0 System.Array.Empty()'。 ASApp.BundleConfig.RegisterBundles(BundleCollection包)inBundleConfig.cs
- LINQ to SQL和存储库模式
- 有没有人在我旁边得到ASP.NET MVC?
- 剃刀:@ Html.Partial()vs @RenderPage()
- 如何将标签与单选button相关联
- Asp.Net MVC:如何在我的url中启用破折号?
- 如何解决:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误的模块“ManagedPipelineHandler”
- “参数字典包含参数的空条目” – 如何解决?