将视图中的返回到MVC 3中的控制器
我目前有一个对象Tag
定义如下:
public class Tag { public string Name { get; set; } }
现在,这是一个模型的集合属性,我将其定义为:
public class MyModel { public string Name { get; set; } public IList Tags { get; set; } }
在我看来,我有以下代码:
@using (Html.BeginForm()) { @Html.LabelFor(m => m.Name) @Html.TextBoxFor(m => m.Name) <!-- Here I'd like a collection of checkbox inputs, where the selected names get passed back to my controller via the IList collection --> }
如何通过我的模型的IList集合返回我的复选框组(在注释中指定)中的所选项?
使用编辑器模板
要获得Checkbox,请在Tag
类中添加另一个Proeprty,以指定是否选中它。
public class Tag { public string Name { get; set; } public bool IsSelected { set; get; } }
现在,从您的GET
操作,您可以在模型的Tags
属性中设置标签列表并将其发送到视图。
public ActionResult AddTag() { var vm = new MyModel(); //The below code is hardcoded for demo. you mat replace with DB data. vm.Tags.Add(new Tag { Name = "Test1" }); vm.Tags.Add(new Tag { Name = "Test2" }); return View(vm); }
现在让我们创建一个编辑器模板,转到View/YourControllerName
并创建一个名为EditorTemaplates
的文件夹,并在那里创建一个与Property type( Tag.cshtml
)同名的新视图。
立即将此内容添加到新的编辑器模板中。
@model Tag @Model.Name : @Html.CheckBoxFor(x => x.IsSelected)
@Html.HiddenFor(x=>x.Name)
现在,在主视图中,使用EditorFor
Html Helper方法调用编辑器模板。
@model MyModel AddTag
@using (Html.BeginForm()) { @Html.LabelFor(m => m.Name) @Html.TextBoxFor(m => m.Name) @Html.EditorFor(m=>m.Tags) }
现在,当您发布表单时,您的模型将具有标签集合,其中选定的复选框将具有IsSelected
属性的True值。
[HttpPost] public ActionResult AddTag(MyModel model) { if(ModelState.IsValid) { //Check for model.Tags collection and Each items IsSelected property value. //Save and Redirect(PRG pattern) } return View(model); }
像这样
这类似于我在网站上所做的事情。
我使用了这个扩展名@ Html.CheckBoxListFor()
希望这可以帮助。
如果你可以在你的Tag模型中添加一个bool IsChecked属性,那么你可以在循环中使用EditorFor(或CheckBoxFor)。 诀窍是使用带索引器的for循环(不是foreach),以便通过视图主模型访问属性。 然后,模型绑定器将为您完成剩下的工作,因此您的POST操作将接收MyModel,其标签IsChecked属性设置为正确的状态。
楷模:
public class Tag { public string Name { get; set; } public bool IsChecked { get; set; } } public class MyModel { public string Name { get; set; } public List Tags { get; set; } }
风景:
@model MyMvcApplication.Models.MyModel @using (Html.BeginForm()) { @Html.LabelFor(m => m.Name) @Html.TextBoxFor(m => m.Name) @for (int i = 0; i < Model.Tags.Count; i++) { @Html.DisplayFor(x => Model.Tags[i].Name) @Html.EditorFor(x => Model.Tags[i].IsChecked) } }