【问题标题】:WebForms GridView row's LinkButton callback not firingWebForms GridView 行的 LinkBut​​ton 回调未触发
【发布时间】:2016-04-21 10:38:45
【问题描述】:

是的,我担心这些问题中的另一个。我确实浪费了大量时间来修复和重新修复 ASP.NET Web 窗体控件中的挑剔回调事件。

这是一个过去可以工作但现在不能工作的页面,我看不到任何相关的变化。我已将页面简化为最基本的内容,并添加了一个虚拟数据源以消除任何可能的外部影响。

尽管如此,它仍然没有引发LinkButton 控件的OnCommand 事件

我给了它两个选择加注,但都没有被跟注:

  1. OnRowAction 方法 - 通过 OnCommand 属性从 LinKButton 控件本身引用
  2. OnRowCommand 方法 - 引用自 GridView.OnRowCommand 侦听器。

代码如下:

<%@ Page Title="Completion Report Results" Language="C#" MasterPageFile="~/PageTemplates/Site.Master" AutoEventWireup="true" CodeBehind="CompletionResults.aspx.cs" Inherits="PlatformNET.LRN.Reports.CompletionResults" %>

<%@ MasterType VirtualPath="~/PageTemplates/Site.Master" %>

<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">

    <asp:GridView ID="UserGrid" runat="server"
        AllowPaging="True" AutoGenerateColumns="False" GridLines="None"
        DataKeyNames="UserID"
        OnRowCommand="OnRowCommand"
        CssClass="stripey"
        HeaderStyle-CssClass="header"
        PagerStyle-CssClass="footer"
        SortedAscendingHeaderStyle-CssClass="currentsortcolumn"
        SortedDescendingHeaderStyle-CssClass="currentsortcolumn">
        <Columns>
            <asp:TemplateField HeaderText="Action">
                <HeaderStyle CssClass="c" />
                <ItemStyle CssClass="c" />
                <ItemTemplate>
                    <asp:LinkButton ID="ManageUserLink" runat="server" OnCommand="OnRowAction" CommandName="ManageUser" CommandArgument='<%# Eval("UserID") %>'>Manage</asp:LinkButton>
                    <asp:LinkButton ID="TrainingRecLink" runat="server" OnCommand="OnRowAction" CommandName="TrainingRec" CommandArgument='<%# Eval("UserID") %>'>Record</asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField HeaderText="UserID" DataField="UserID">
                <HeaderStyle CssClass="c" />
                <ItemStyle CssClass="c" />
            </asp:BoundField>
        </Columns>
    </asp:GridView>
</asp:Content>

下面是代码:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Web.Caching;
using System.Web.UI.WebControls;
using AssessmentClassLib.BLL.QueryHelpers;
using AssessmentClassLib.BLL.Reporting;
using AssessmentClassLib.DAL;
using PlatformNET.BLL;
using PlatformNET.CustomControls;
using PlatformNET.LRN.BLL;

namespace PlatformNET.LRN.Reports
{
    public partial class CompletionResults : ReportingPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            ReportType = "Completion";

            if (!Page.IsPostBack)
                BindGrid();

            base.MakeBreadcrumb(ReportingPageID.completionList);
        }

        internal class DummyItem
        {
            public int UserID { get; set; }
        }

        protected void BindGrid()
        {
            var dummy = new List<DummyItem>();
            for (var i = 0; i < 20; i++)
                dummy.Add(new DummyItem() { UserID = i });

            UserGrid.AllowPaging = true;
            UserGrid.AllowCustomPaging = true;
            UserGrid.VirtualItemCount = 100;
            UserGrid.PageSize = 20;
            UserGrid.PageIndex = 0;
            UserGrid.DataSource = dummy;
            UserGrid.DataBind();
        }

        protected void OnRowAction(object sender, CommandEventArgs e)
        {
            Debug.WriteLine("OnMyCommand(\"{0}\",\"{1}\")", e.CommandName, e.CommandArgument);
        }

        protected void OnRowCommand(object sender, GridViewCommandEventArgs e)
        {
            Debug.WriteLine("OnRowCommand(\"{0}\",\"{1}\")", e.CommandName, e.CommandArgument);
        }
    }
}

检查完毕:

  1. 我没有在回发时重新绑定网格(最常见的新手错误)
  2. 这两个LinkButton 控件不是动态生成的,而是单元格模板的一部分
  3. LinkButton 控件都具有OnCommandCommandArgument 属性,它们在绑定期间填充(通过添加OnRowDataBound 回调来检查以在绑定期间进行检查。
  4. 链接按钮上生成的 JS 看起来不错,例如&lt;a id="MainContent_UserGrid_ManageUserLink_0" title="Manage User" href="javascript:__doPostBack('ctl00$MainContent$UserGrid$ctl02$ManageUserLink','')"&gt;Manage&lt;/a&gt;
  5. 我设置了GridView的OnRowCommand属性,回调中存在函数

请告知为什么这个非常简单的示例不再有效。
我正在使用 .NET Framework 4.6。 谢谢。

【问题讨论】:

  • 您是否尝试在浏览器开发者工具的网络视图中查看请求。它可能会返回一个有用的 500 错误。
  • 谢谢。一切看起来都很好。帖子返回,表单数据显示:_EVENTTARGET:ctl00$MainContent$UserGrid$ctl02$ManageUserLink_EVENTARGUMENT 存在但显示为空白。这是预期的吗?我假设 _EVENTARGUMENT 不是必需的,因为行号是在 _EVENTTARGET 中编码的。
  • 抱歉,我们必须检查另一个基本问题。你怎么知道它没有开火?回发发生后,您是否通过后面的代码进行调试?通过 page_load 是否正常?顺便说一句,如果存在的话,看看 ReportingPage 的 page_load 中发生了什么可能会很有用
  • 没有问题。我在OnRowActionOnRowCommand 方法的Debug.WriteLine() 行上设置了一个断点,以查看是否有任何被命中。调试工作正常,因为我还在Page_Load 上设置了一个断点,并且可以在第一次调用时逐步完成绑定过程(例如)。 Page_Load 断点也是回调,但不是 OnRow... 方法。
  • 只是好奇:如果您在每次回发(if (!IsPostBack) 之外)上绑定数据,它会起作用吗?当我在测试期间错误地禁用了 ViewState 并且一切正常时,我就这样做了。

标签: c# asp.net gridview


【解决方案1】:

仅供参考,我将您的代码复制到了我的一个 Web 表单应用程序中,它运行良好。我已经看到 eval 语句在 Grids 和其他中继器中表现得很挑剔。

您是否尝试过对 CommandArgument 值进行硬编码以查看是否有任何改变?

【讨论】:

  • 谢谢。是的,我已经硬编码了CommandArgument 属性,但它仍然没有触发。我假设实际的 CommandArgument 值在客户端周期期间隐藏在 viewstate 中,因为它没有显示在 JS 中。
  • 您的代码运行良好这一事实表明问题出在其他地方?我确定ViewState 已启用,并且生成的HTML 页面肯定包含一个相当大的__VIEWSTATE 字段。但是在回发时,事件不会触发,我也不会重新绑定,所以我最终得到一个空的GridView(没有行)。如果启用ViewState 会发生这种情况吗?
  • 在这一点上,我建议创建一个新的干净的 Web 应用程序,这应该相当容易,并在其中复制您的 Web 应用程序的各个部分,直到问题被重现。这里的原因隐藏在某个地方,潜在的地方很多:母版页、web.config、基页类。
  • 我相信所有 4.x 程序集都将显示为 v4.0.30319。我没有任何最近的 Web 表单应用程序来测试它,因为我几年前切换到 MVC。我已经将许多 Web 窗体应用程序升级到更新的框架,并且总是遇到奇怪的问题。所以我制定了一个规则,在较新的框架中创建一个新项目,并将代码从旧框架复制到新框架。
  • @ClintB - 根据我的测试,据我所知,ViewState 确实包含 GridView 的值(这里也提到:stackoverflow.com/questions/5503525/…)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 2023-03-12
  • 2021-12-17
  • 1970-01-01
  • 2023-03-10
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多