在下面截断的cshtml摘录中,我使用Grid来构建表:
@using (Html.BeginForm("DeleteSelected", "ControllerName", FormMethod.Post))
{
@Html.Grid(Model).Columns(column => {
column
.For(x => x.CreationTime).Format("{0:g}");
column
.For(x => x.OtherPropery);
column
.For(x => x.YetAnotherProperty);
column
.For(x => Html.CheckBox(x.IdThatICanUseToGrabModels, new {@class = "isSelectedCheck"}))
.Header(@<div><input type="checkbox" id="isSelectedHeader"/></div>);
});
当我通过表单POST提交我的网格时,我希望能够确定选择哪些行并在我的控制器逻辑中相应地执行操作。最后一个column.For(...)
语句创建一个复选框输入和一个隐藏输入。
显然这是预期的行为。由于两个输入具有相同的名称,如何期望循环遍历FormCollection
对象并获得正确的值?每个密钥(名为x.IdThatICanUseToGrabModels
)最终都可以包含多个值。
其他人如何超越这个?
感谢,
布赖恩
答案 0 :(得分:2)
CheckBox / CheckBoxFor助手旨在与视图模型上的布尔属性一起使用。所以:
public class MyViewModel
{
public DateTime CreationTime { get; set; }
public string OtherProperty { get; set; }
public string YetAnotherProperty { get; set; }
public bool IdThatICanUseToGrabModels { get; set; }
}
然后:
@Html.Grid(Model).Columns(column =>
{
column.For(x => x.CreationTime).Format("{0:g}");
column.For(x => x.OtherProperty);
column.For(x => x.YetAnotherProperty);
column
.Custom(@<text>@Html.CheckBox("values", item.IdThatICanUseToGrabModels)</text>)
.Header(@<div><input type="checkbox" id="isSelectedHeader"/></div>);
})
最后:
[HttpPost]
public ActionResult DeleteSelected(bool[] values)
{
...
}
您还可以拥有一个与布尔值对应的隐藏ID(您将有一对由id和布尔属性组成,这将允许您在控制器操作中知道选择了哪个ID。)
答案 1 :(得分:0)
所以现在我已经解决了这个问题:
column
.For(x => Html.Raw("<input name="+x.AMPExamNumber.ToString()+" type=\"checkbox\" />"))
.Header(@<div><input type="checkbox" id="isSelectedHeader"/></div>);
然后我可以从FormCollection
对象中获取键值对,使用它们从数据库中选择我的对象。
这看起来很糟糕。如果有人有更好的解决方案,请发帖,以免我被迫将此标记为解决方案...