如何制作一个带有复选框列的MVC 3 Webgrid?

11

下面的代码将在Web网格的一列中插入一个“操作链接”(actionlink)。

    @{
    View.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";

    var usersGrid = new WebGrid(source: Model,
        rowsPerPage: 40);
}
@usersGrid.GetHtml(
        tableStyle: "grid",
        headerStyle: "head",
        alternatingRowStyle: "alt",
                columns: usersGrid.Columns(
                    usersGrid.Column(format: (item) => 
                         Html.ActionLink("Edit", "Edit", new { id = item.Id})),
                    usersGrid.Column("Surname")
        )
    )

但如果我将那行代码替换为这个:

                usersGrid.Column(format: (item) => Html.CheckBox(item.Id)),

我收到了这个错误:

Error 4 最佳重载方法匹配 'System.Web.Helpers.WebGrid.Column(string, string, System.Func, string, bool)'时有一些无效参数。

我不太理解两者之间的区别,为什么其中一个可以工作而另一个会出错?

最终目标是能够勾选若干复选框,然后打印它们的信息。


请查看:https://dev59.com/P1HTa4cB1Zd3GeqPV-4V#4564506 - Serguzest
这将会帮助你:http://weblogs.asp.net/imranbaloch/archive/2011/09/13/webgrid-helper-with-check-all-checkboxes.aspx - Imran Qadir Baksh - Baloch
10个回答

24

4
如果您有一个布尔值需要检查,可以添加一个额外的条件来进行检查。下面是需要翻译的代码:usersGrid.Column(header: "Header", format: @<text><input name="HasFormgivaren" type="checkbox" value="@item.ID" @(item.IsChecked == 1 ? "Checked" : null) /></text>) - Eric Herlitz

5
这对我有效:
grid.Column("SiparisNo", "Seç", format: (item) => Html.CheckBox(String.Format("Secili_{0}", (int)item.SiparisNo), false, new { @style = "width:60px;" }))

4

当你在C#中使用扩展方法(Html。*)和动态变量(item)时,你需要小心,因为它们不能很好地协同工作。当你执行新的{}投射或调用ToString时,它不再是动态的。作为替代,你可以进行强制转换:(object)item.Id。


谢谢,我今天晚些时候会有机会尝试这个。 - 4imble
这是否意味着在 VB 中处理得更好?只是随口问问 :) - Erx_VB.NExT.Coder
我不是VB专家,但我认为这对于VB来说不是问题。我相信在那里动态只是被转换为对象。C#在运行时绑定动态,但此时无法解析扩展方法。 - chenriks

2

usersGrid.Column(format: (item) => Html.CheckBox((string)item.Id)),

这应该可以工作。


1
最简单的方法是:


usersGrid.Column(format: (item) => Html.CheckBox("Id"))

0

这个错误是因为CheckBox调用没有返回与ActionLink相同的数据类型。

这是你要做的。对于动作链接调用和复选框调用,使用相同的参数进行消息框调用,将它们包装在TypeName()函数调用中,并在msgbox中显示结果供您查看。同时,在两者中都执行.ToString(),现在,查看结果,它应该告诉您返回的数据类型是否存在差异,如果可以,请发布结果,我可以告诉您更多信息。让我知道。


谢谢,我今天晚些时候会有机会尝试这个。 - 4imble
@kohan 好的,当你这样做时让我知道,我现在也很感兴趣,哈哈,干杯伙计。 - Erx_VB.NExT.Coder
不要认为问题出在复选框上,而是动态项目(我想这就是chenriks所说的)。但无论如何,我现在已经解决了。非常感谢! - 4imble
@kohan 不过,这是因为数据类型返回不一致,对吧?你尝试使用TypeName和tostring方法来获取它,还是最初就返回了错误的数据类型? - Erx_VB.NExT.Coder

0

grid.Column("ID", "选择", format: (item) => Html.CheckBox((string)item.ID, false, new { @style = "width:60px;" }), canSort: false)

这个完美运作。


0
经过激烈的搜索,我找到了一个最优解,如果您发现使用HTML助手很困难,可以使用这个逻辑。
grid.Column(header: "", format: @<text><input name="chkBox" type="checkbox" value="@item.Id" @(item.Id == false ? null : "checked") /></text>)

-3

试试这个

new HtmlString(usersGrid.Column(format: (item) => Html.CheckBox(item.Id)).ToString()),

替代

usersGrid.Column(format: (item) => Html.CheckBox(item.Id)),

-3

**

@{
  var grid = new WebGrid(source: Model.ToList(), canPage: true, canSort: true);
  grid.Pager (WebGridPagerModes.All);
}

**

<div id="g1">
    @grid.GetHtml(

    columns:grid.Columns
    (grid.Column(columnName:"paymentno",header:"PAYMENT NO"),

    grid.Column(columnName:"mname",header:"NAME"),

    grid.Column(columnName:"pamt",header:"AMOUNT"),

    grid.Column(header: "Header", format: @<text><input name="HasFormgivaren" type="checkbox" 
        value="@item.checkresult" @(item.checkresult == "True" ? "Checked" : null) /></text>)
    )
    )
</div>

你应该添加一些解释 - Massimo Petrus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接