如何全局取消特定业务逻辑的回发事件?

时间:2012-09-25 19:28:06

标签: c# asp.net asp.net-3.5

我希望能够显示一个页面,但禁用所有控件。这个想法是让用户查看标准页面,但实际上并不与页面交互。禁用所有UI控件服务器端很简单,但我主要担心的是一个“有创造力”的用户试图用假信息手动发布表单。我的问题有两个:

  1. 内置事件验证是否会引发狡猾的活动?
  2. 如果事件验证没有捕获它,有没有办法全局抛弃回发事件(例如按钮点击,而不是整个生命周期)

3 个答案:

答案 0 :(得分:2)

解决你的两个问题之一:

  

如果事件验证没有捕获它,有没有办法全局抛弃回发事件(例如按钮点击,而不是整个生命周期)?

一个选项可能是向ViewState添加值,如果该值存在于回发上,则将用户重定向到错误页面。应该捕获用户篡改视图状态。这不符合您希望仅丢弃回发事件,但可能会在从您认为无法回发的页面收到回发后重定向到错误页面。

if (ViewState["PageSetToReadOnly"] != null)
{
  // Redirect to error page.
}

另一种选择是检查它是否是页面的PreInit事件中的回发,如果是,则取消连接事件处理程序:

if (Page.IsPostBack)
{
  this.Button1.Click -= new EventHandler(Button1_Click);
}

答案 1 :(得分:2)

不,你无法阻止正常的Postback进程。

您如何确定是否应禁用该页面? Postback在您的按钮处理程序中使用相同的检查。如果是的话,请不要保存任何信息。

public void button1_Click(object sender, EventArgs e)
{
    if(Page is disabled)
    {
        return
    }
    //Do normal save routine
}

答案 2 :(得分:1)

我认为全局取消回发的最佳方法是覆盖此Page方法。您可以执行在OnLoad事件期间设置DoNotProcessPostBack所需的任何逻辑:

Protected Overrides Sub RaisePostBackEvent(sourceControl As IPostBackEventHandler, eventArgument As String)
    If DoNotProcessPostBack = False Then
        MyBase.RaisePostBackEvent(sourceControl, eventArgument)
    End If
End Sub

sourceControl是执行回发并跳过MyBase.RaisePostBackEvent的控件基本上无效为它引发事件。