我目前有一个对象Tag
,其定义如下:
public class Tag
{
public string Name { get; set; }
}
现在,这是模型的集合属性,我将其定义为:
public class MyModel
{
public string Name { get; set; }
public IList<Tag> Tags { get; set; }
}
在我看来,我有以下代码:
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name)
</div>
<div>
<!--
Here I'd like a collection of checkbox inputs, where the selected names
get passed back to my controller via the IList<Tag> collection
-->
</div>
<input type="submit" value="Submit" />
}
如何通过我的模型的IList集合返回我的复选框组(在评论中指定)中的所选项目?
答案 0 :(得分:7)
使用编辑器模板
要获得复选框,请在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
的文件夹,并在那里创建一个与属性类型(Tag.cshtml
)同名的新视图
立即将此内容添加到新的编辑器模板中。
@model Tag
<p>
<b>@Model.Name</b> :
@Html.CheckBoxFor(x => x.IsSelected) <br />
@Html.HiddenFor(x=>x.Name)
</p>
现在,在主视图中,使用EditorFor
Html Helper方法调用编辑器模板。
@model MyModel
<h2>AddTag</h2>
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name)
</div>
<div>
@Html.EditorFor(m=>m.Tags)
</div>
<input type="submit" value="Submit" />
}
现在,当您发布表单时,您的模型将具有标签集合,其中所选复选框将具有IsSelected
属性的真值。
[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);
}
喜欢这个
答案 1 :(得分:1)
答案 2 :(得分:0)
如果你可以在你的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<Tag> Tags { get; set; }
}
观点:
@model MyMvcApplication.Models.MyModel
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name)
</div>
<div>
@for (int i = 0; i < Model.Tags.Count; i++)
{
@Html.DisplayFor(x => Model.Tags[i].Name)
@Html.EditorFor(x => Model.Tags[i].IsChecked)
}
</div>
<input type="submit" value="Submit" />
}