【发布时间】:2017-09-15 11:14:40
【问题描述】:
我已经阅读了很多关于流行的无效的回发或回调参数错误消息。
如果我在网页 GridView 完成数据绑定之前通过单击任何类型的链接/重定向(在本例中为 ASP LinkButton,但使用 ASP 按钮时会出现相同的结果)来加速网页,我会收到此错误.
绑定的数据非常大,理想情况下,我应该添加分页以使其执行得更快。但是,除了点击之外,没有其他数据被修改,包括任何客户端脚本,所以我不确定为什么会出现这个错误。
完全错误:
回发或回调参数无效。使用配置或页面中的 启用事件验证。出于安全目的,此功能验证回发或回调事件的参数是否源自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用 ClientScriptManager.RegisterForEventValidation 方法注册回发或回调数据以进行验证。
出于安全原因,我不想禁用事件验证,并且我知道大型 DataBind 操作是导致此问题的原因,但我不知道为什么。
我也尝试过禁用网格验证作为一个简单的测试,但这并没有解决问题:
myGrid.ValidateRequestMode = ValidateRequestMode.Disabled
LinkButton不使用PostBackUrl,而是使用点击事件+Response.Redirect(我删除了所有不相关的代码)。
LinkButton 也是在 DataBind 发生之前创建的。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim application As IApplication
If Not IsPostBack Then
application = Session("App")
If application IsNot Nothing Then
AddLinkButton("Test", "EntityPage", CommandType.PageLink)
ShowData(application)
End If
End If
End Sub
Private Sub AddLinkButton(label As String, commandArgument As String,
Optional command As CommandType = CommandType.Link)
Dim linkBtn As New LinkButton()
linkBtn.Text = label
linkBtn.CssClass = "myLinkBtn"
linkBtn.CommandName = command.ToString
linkBtn.CommandArgument = commandArgument
AddHandler linkBtn.Click, AddressOf LinkButton_Click
panel.Controls.Add(linkBtn)
End Sub
Private Sub LinkButton_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim linkBtn As LinkButton = CType(sender, LinkButton)
Select linkBtn.CommandName
Case "Link" :
Response.Redirect(linkBtn.CommandArgument, False)
' more cases + additional logic that I removed from the example
End Select
End Sub
Friend Sub ShowData(application As IApplication)
Dim entities As List(Of Entity)
If Not IsPostBack Then
entities = application.GetEntities()
myGridView.DataSource = entities
myGridView.DataBind()
End If
End Sub
您认为为什么会发生这种情况?有没有办法成功中断数据绑定?
编辑:还尝试使用 Button 而不是 LinkButton,并使用 UseSubmitBehavior = True,但结果相同。
【问题讨论】:
-
如果你想创建一个链接,只需创建一个链接(!)(a-tag)并且不要使用链接按钮。 Linkbutton 将导致回发发生,link-tag 不会。此处不需要回发,因为您只希望用户跟随指向另一个页面的链接。 Postback会将整个页面回传到服务器进行解析,耗时/效率低,这里不需要。
-
@Esko 可以做到这一点,同时还允许我运行“LinkButton_Click”事件处理程序吗?
-
恐怕不行,在您的示例中,除了重定向之外,您没有做任何其他事情,在此之前需要做什么?
-
@Esko 我删除了 LinkButton_Click 中的一些代码。通常有更多的 select-case 语句和额外的逻辑,所以它是必需的。
-
那恐怕链接不够用。您可以使用 javascript/ajax 执行逻辑,或更改其他逻辑。但这似乎只是解决数据绑定过大的真正问题的绷带。分页/过滤数据难道不会让用户更友好吗?