【发布时间】:2016-04-21 10:38:45
【问题描述】:
是的,我担心这些问题中的另一个。我确实浪费了大量时间来修复和重新修复 ASP.NET Web 窗体控件中的挑剔回调事件。
这是一个过去可以工作但现在不能工作的页面,我看不到任何相关的变化。我已将页面简化为最基本的内容,并添加了一个虚拟数据源以消除任何可能的外部影响。
尽管如此,它仍然没有引发LinkButton 控件的OnCommand 事件
我给了它两个选择加注,但都没有被跟注:
-
OnRowAction方法 - 通过OnCommand属性从 LinKButton 控件本身引用 -
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);
}
}
}
检查完毕:
- 我没有在回发时重新绑定网格(最常见的新手错误)
- 这两个
LinkButton控件不是动态生成的,而是单元格模板的一部分 -
LinkButton控件都具有OnCommand和CommandArgument属性,它们在绑定期间填充(通过添加OnRowDataBound回调来检查以在绑定期间进行检查。 - 链接按钮上生成的 JS 看起来不错,例如
<a id="MainContent_UserGrid_ManageUserLink_0" title="Manage User" href="javascript:__doPostBack('ctl00$MainContent$UserGrid$ctl02$ManageUserLink','')">Manage</a> - 我设置了
GridView的OnRowCommand属性,回调中存在函数
请告知为什么这个非常简单的示例不再有效。
我正在使用 .NET Framework 4.6。
谢谢。
【问题讨论】:
-
您是否尝试在浏览器开发者工具的网络视图中查看请求。它可能会返回一个有用的 500 错误。
-
谢谢。一切看起来都很好。帖子返回,表单数据显示:
_EVENTTARGET:ctl00$MainContent$UserGrid$ctl02$ManageUserLink。_EVENTARGUMENT存在但显示为空白。这是预期的吗?我假设_EVENTARGUMENT不是必需的,因为行号是在_EVENTTARGET中编码的。 -
抱歉,我们必须检查另一个基本问题。你怎么知道它没有开火?回发发生后,您是否通过后面的代码进行调试?通过 page_load 是否正常?顺便说一句,如果存在的话,看看 ReportingPage 的 page_load 中发生了什么可能会很有用
-
没有问题。我在
OnRowAction和OnRowCommand方法的Debug.WriteLine()行上设置了一个断点,以查看是否有任何被命中。调试工作正常,因为我还在Page_Load上设置了一个断点,并且可以在第一次调用时逐步完成绑定过程(例如)。Page_Load断点也是回调,但不是OnRow...方法。 -
只是好奇:如果您在每次回发(
if (!IsPostBack)之外)上绑定数据,它会起作用吗?当我在测试期间错误地禁用了 ViewState 并且一切正常时,我就这样做了。