Chinaunix首页 | 论坛 | 博客
  • 博客访问: 266889
  • 博文数量: 54
  • 博客积分: 1425
  • 博客等级: 上尉
  • 技术积分: 541
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-27 23:26
文章分类

全部博文(54)

文章存档

2018年(2)

2015年(3)

2014年(6)

2013年(5)

2012年(5)

2011年(7)

2010年(14)

2009年(1)

2008年(3)

2007年(6)

2006年(1)

2005年(1)

我的朋友

分类: WINDOWS

2010-05-08 12:11:41

“/WebSite1”应用程序中的服务器错误。
--------------------------------------------------------------------------------

回发或回调参数无效。在配置中使用 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
说明: 执行当前 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 方法存储自己的安全回发相关信息。

本例中,系统默认生成LinkButtonhref"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.RegisterForEventValidationLinkButton服务器端控件进行“生成事件的客户端控件的唯一控件 ID 和事件参数为验证注册事件引用”操作。保证向服务器端传送数据参数的有效性。才能保证网页的正常运行和数据处理。完整的程序示例代码如下:

代码段4

LinkButton.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="LinkButton.aspx.vb" Inherits="LinkButton" %>

3C//DTD XHTML 1.0 Transitional//EN" "">

    LinkButton</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes">示例<SPAN lang=EN-US>

   

    

              

       

   

 

        复位

   

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

 

阅读(3024) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~