【问题标题】:Best way to allow postback on a gridview without viewstate允许在没有视图状态的网格视图上回发的最佳方法
【发布时间】:2012-04-16 15:55:19
【问题描述】:

我的 gridview 基本上是用户从中选择一个结果的命中列表,我希望得到一个回传,说明他选择了哪个结果。网格内容不需要在回发往返过程中保留下来,因为一旦他选择了一个项目,命中列表就会消失。

我不想使用视图状态,因为命中列表可能很大。我不想在 PageLoad 中从数据库中绑定数据以重新填充网格,因为搜索可能需要一段时间。

我现在想的是,我可以在“选择”链接上放置一些 javascript,以将所选项目的 ID 存储在隐藏字段中,然后调用 __doPostBack

这看起来还是有点笨拙。你能想出更清洁的方法吗?

【问题讨论】:

    标签: asp.net gridview postback viewstate


    【解决方案1】:

    如果在用户单击行中的任意位置时应触发回发,请使用ItemDataBound 事件附加客户端onclick 处理程序:

    protected void GridView1_ItemDataBound(object sender, GridViewRowEventArgs e)
    {
        var dataItem = e.Item as GridViewRow;
        if (dataItem != null)
        {
            dataItem.Attributes["onclick"] = string.Format("__doPostBack(this, '{0}')", e.Row.RowIndex);
        }
    }
    

    【讨论】:

    • 谢谢,这基本上就是我所做的。实际上,我只是向链接按钮添加了一个 onclick 处理程序,而不是整行,并且在事件参数中我输入了项目的 ID。我发现我必须通过查看 Page_Load 中的 __EVENTTARGET 和 __EVENTARGUMENT 来检测它,但它仍然运行良好,并且看起来和我能想到的任何其他东西一样优雅。我很惊讶他们没有以一种更容易做到这一点的方式来构建,因为这似乎是一个相当普遍的要求
    【解决方案2】:

    所选项目的 ID 是不是用户不应该看到的敏感信息?

    如果不是,您可以将选择按钮设置为指向下一页的链接,并将 ID 作为查询字符串变量。点击会跳转到下一页,不需要回发。

    【讨论】:

    • 它需要回发到同一页面。屏幕上有很多其他控件和需要视图状态的东西,所以我不能只使用“get”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2020-09-28
    相关资源
    最近更新 更多