我希望能够显示一个页面,但禁用所有控件。这个想法是让用户查看标准页面,但实际上并不与页面交互。禁用所有 UI 控件服务器端很简单,但我主要担心的是“有创意”的用户试图手动将表单发回虚假信息。我的问题有两个:
- 内置的事件验证会捕捉到不正当的活动吗?
- 如果事件验证没有捕捉到它,有没有办法全局丢弃回发事件(例如按钮单击,而不是整个生命周期)
我希望能够显示一个页面,但禁用所有控件。这个想法是让用户查看标准页面,但实际上并不与页面交互。禁用所有 UI 控件服务器端很简单,但我主要担心的是“有创意”的用户试图手动将表单发回虚假信息。我的问题有两个:
解决您的两个问题之一:
如果事件验证没有捕捉到它,有没有办法全局丢弃回发事件(例如按钮单击,而不是整个生命周期)?
一种选择可能是向 ViewState 添加一个值,如果该值存在于回发中,则将用户重定向到错误页面。应该捕获篡改视图状态的用户。这不符合您仅丢弃回发事件的愿望,但可能在从您认为不可能回发的页面接收回发后重定向到错误页面是可以的。
if (ViewState["PageSetToReadOnly"] != null)
{
// Redirect to error page.
}
另一种选择是检查它是否是页面的 PreInit 事件中的回发,如果是,则取消连接事件处理程序:
if (Page.IsPostBack)
{
this.Button1.Click -= new EventHandler(Button1_Click);
}
不,你不能停止正常的Postback
进程。
您如何确定是否应禁用该页面?在Postback
您的按钮处理程序中使用相同的检查。如果是真的,那么不要保存任何信息。
public void button1_Click(object sender, EventArgs e)
{
if(Page is disabled)
{
return
}
//Do normal save routine
}
我认为全局取消回发的最佳方法是覆盖此 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 的控件,基本上会使为其引发事件无效。