在大量编辑表单页面上,我显示了大约50个具有一些布尔属性的对象。控制器接收带有编辑页面中所有值的FormCollection。
public void _EditAll(FormCollection c)
{
int i = 0;
if (ModelState.IsValid)
{
var arrId = c.GetValues("channel.ID");
var arrName = c.GetValues("channel.displayedName");
var arrCheckbox = c.GetValues("channel.isActive");
for (i = 0; i < arrId.Count(); i++)
{
Channel chan = db.Channels.Find(Convert.ToInt32(arrId[i]));
chan.displayedName = arrName[i];
chan.isActive = Convert.ToBoolean(arrCheckbox[i]);
db.Entry(chan).State = EntityState.Modified;
}
db.SaveChanges();
}
}
现在,对于复选框,MVC在表单上创建隐藏的输入(否则“false”无法回发)。在控制器中,当收到FormCollection时,这会导致我收到一个说明
的数组因为隐藏的复选框与可见的复选框具有相同的名称。
处理该问题并获得正确的复选框值是什么好方法?
答案 0 :(得分:1)
用于编辑具有布尔字段的实体数组的示例。
实体:
public class Entity
{
public int Id { get; set; }
public bool State { get; set; }
}
控制器:
public ActionResult Index()
{
Entity[] model = new Entity[]
{
new Entity() {Id = 1, State = true},
new Entity() {Id = 2, State = false},
new Entity() {Id = 3, State = true}
};
return View(model);
}
[HttpPost]
public ActionResult Index(Entity[] entities)
{
// here you can see populated model
throw new NotImplementedException();
}
查看:
@model Entity[]
@{
using (Html.BeginForm())
{
for (int i = 0; i < Model.Count(); i++ )
{
@Html.Hidden("entities[" + i + "].Id", Model[i].Id)
@Html.CheckBox("entities[" + i + "].State", Model[i].State)
}
<input type="submit"/>
}
}
唯一棘手的问题是html元素的命名 关于绑定数组的More info。
答案 1 :(得分:0)
我正在转换包含checkbox-values的所有数组:
“false”=&gt; “假”,如果没有“真实”之前