MvcContrib.Grid在列中呈现额外的隐藏输入

时间:2012-03-13 18:54:41

标签: asp.net-mvc-3 razor checkbox http-post hidden

在下面截断的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)最终都可以包含多个值。

其他人如何超越这个?

感谢,

布赖恩

2 个答案:

答案 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对象中获取键值对,使用它们从数据库中选择我的对象。

这看起来很糟糕。如果有人有更好的解决方案,请发帖,以免我被迫将此标记为解决方案...