分类: WINDOWS
2010-05-08 12:11:41
“/WebSite1”应用程序中的服务器错误。
--------------------------------------------------------------------------------
回发或回调参数无效。在配置中使用
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
修改LinkButton控件的传递参数。
Linkbutton属于服务器端控件,在含有LinkButton控件的aspx文件被客户端请求后,该aspx文件的服务器端处理程序将返给客户端的HTML网页中自动设置Linkbutton控件的href属性值为:text,注意该值是处理程序自动产生的,不可更改,一旦使用如语句LinkButton.Attributes.Item("href") = "javascript:" + "__doPostBack('LastCtrl','" + var1.ToString() + "' )",虽然网页看起来运行良好,但是如果用鼠标点击该链接,将在客户端产生如下效果:(图1)
究其根源在于__EVENTVALIDATION 隐藏字段,它是 ASP.NET 2.0 的新增安全措施。该功能可以阻止由潜在的恶意用户从客户端发送的未经授权的请求。为了确保每个回发和回调事件来自于所期望的用户界面元素,页将在事件中添加额外的验证层。页通常通过将请求的内容与 __EVENTVALIDATION 字段中的信息进行匹配,来验证未在客户端添加额外的输入域,并且该值是在服务器已知的列表中选择的。页将在生成期间创建事件验证字段,而这是最不可能获取该信息的时刻。 像视图状态一样,事件验证字段包含散列值以防止发生客户端篡改。控件可使用ClientScriptManager 对象的 RegisterEventForValidation 方法存储自己的安全回发相关信息。
本例中,系统默认生成LinkButton的href为"javascript:__doPostBack('NextCtrl',''),其中第二个参数__EVENTARGUMENT为空,此控件的状态信息在服务器端由__VIEWSTATE保存,它记录服务器端控件的初始状态,如果后来程序运行造成LinkButton控件的HREF发生变化,比如href变为”javascript:" + "__doPostBack('NextCtrl','" + param + "' )”,即__EVENTARGUMENT为变量param,在客户端将__EVENTTARGET 和__EVENTARGUMENT回传给服务器端处理程序时,服务器通过__EVENTVALIDATION进行校验发现服务器端控件的初始设置被篡改,将产生如上图的报错信息。
为保证程序运行过程中修改信息有效,并能正确的将信息提交到服务器端,则需要用到:Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter),即对Render的重载,在其内使用Page.ClientScript.RegisterForEventValidation对LinkButton服务器端控件进行“生成事件的客户端控件的唯一控件 ID 和事件参数为验证注册事件引用”操作。保证向服务器端传送数据参数的有效性。才能保证网页的正常运行和数据处理。完整的程序示例代码如下:
代码段4
LinkButton.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="LinkButton.aspx.vb" Inherits="LinkButton" %>
LinkButton.aspx.vb
Partial Class LinkButton
Inherits System.Web.UI.Page
Public cur_date As Date
Dim _cbMessage As String = ""
'临时添加对象的声明
Protected WithEvents LblCurMonth As New System.Web.UI.WebControls.Label
Protected WithEvents LinkLastMonth As New System.Web.UI.WebControls.LinkButton
Protected WithEvents LinkNextMonth As New System.Web.UI.WebControls.LinkButton
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim tmpdate As String
Dim tmptarg As String
If IsPostBack Then
tmpdate = Request.Form("__EVENTARGUMENT")
tmptarg = Request.Form("__EVENTTARGET")
If tmptarg = "ResetLB" Then
cur_date = DateTime.Now
Else
If tmptarg = "LastCtrl" Or tmptarg = "NextCtrl" Then
cur_date = Convert.ToDateTime(tmpdate)
End If
End If
Else
If cur_date.Year = "1" Then
cur_date = DateTime.Now
End If
End If
MonthReload(cur_date)
End Sub
Public Function getOtherMonth(ByVal cur_date As Date, ByVal op As Integer) As Date
Return cur_date.AddMonths(op)
End Function
Public Function getHanziMonth(ByVal cur_month As String) As String
Return "第" + cur_month + "月"
End Function
Protected Sub MonthReload(ByVal cur_date As Date)
Dim cell As TableCell
Dim row As TableRow
Dim LastMonth As Date
Dim NextMonth As Date
LblCurMonth.Text = cur_date.Year.ToString + "年" + cur_date.Month.ToString + "月"
LastMonth = getOtherMonth(cur_date, -1)
NextMonth = getOtherMonth(cur_date, +1)
row = New TableRow
row.ID = "Header"
'翻上月********导航连接最重要的部分就是这个赋值操作*********
cell = New TableCell
LinkLastMonth.Text = getHanziMonth(LastMonth.Month.ToString)
LinkLastMonth.ID = "LastCtrl"
LinkLastMonth.CommandArgument = LastMonth.ToString
LinkLastMonth.Attributes.Item("href") = "javascript:" + "__doPostBack('LastCtrl','" + LastMonth.ToString() + "' )"
cell.Controls.Add(LinkLastMonth)
row.Cells.Add(cell)
row.HorizontalAlign = HorizontalAlign.Center
'当前月
cell = New TableCell
cell.Controls.Add(LblCurMonth)
row.Cells.Add(cell)
row.HorizontalAlign = HorizontalAlign.Center
'翻下月********导航连接最重要的部分就是这个赋值操作*********
cell = New TableCell
LinkNextMonth.Text = getHanziMonth(NextMonth.Month.ToString)
LinkNextMonth.ID = "NextCtrl"
LinkNextMonth.CommandArgument = NextMonth.ToString
LinkNextMonth.Attributes.Item("href") = "javascript:" + "__doPostBack('NextCtrl','" + NextMonth.ToString() + "' )"
cell.Controls.Add(LinkNextMonth)
row.Cells.Add(cell)
row.HorizontalAlign = HorizontalAlign.Center
'加入月份导航控制行
row.BackColor = Drawing.Color.Silver
tb1.Rows.Add(row)
'产生时间标注
row = New TableRow
row.ID = "CurrentDay"
cell = New TableCell
cell.Text = cur_date.ToString
cell.ColumnSpan = 3
row.Cells.Add(cell)
row.HorizontalAlign = HorizontalAlign.Center
row.BackColor = Drawing.Color.LightGray
tb1.Rows.Add(row)
End Sub
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
'使用表示生成事件的客户端控件的唯一控件 ID 和事件参数为验证注册事件引用。
Dim tmpdate As Date
tmpdate = Convert.ToDateTime(LinkNextMonth.CommandArgument)
Page.ClientScript.RegisterForEventValidation(LinkNextMonth.UniqueID, tmpdate.ToString())
tmpdate = Convert.ToDateTime(LinkLastMonth.CommandArgument)
Page.ClientScript.RegisterForEventValidation(LinkLastMonth.UniqueID, tmpdate.ToString())
MyBase.Render(writer)
End Sub
End Class