当我从客户端返回一个页面时,我得到以下错误。我有JavaScript代码,修改asp:ListBox在客户端。
我们如何解决这个问题?
错误详情如下:
Server Error in '/XXX' Application.
--------------------------------------------------------------------------------
Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ArgumentException: Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[ArgumentException: Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.]
System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +2132728
System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +108
System.Web.UI.WebControls.ListBox.LoadPostData(String postDataKey, NameValueCollection postCollection) +274
System.Web.UI.WebControls.ListBox.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +11
System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +353
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1194
--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433
你需要做2或3个,不要禁用事件验证。
在asp:listbox客户端添加项目有两个主要问题。
The first is that it interferes with event validation. What came back to the server is not what it sent down.
The second is that even if you disable event validation, when your page gets posted back the items in the listbox will be rebuilt from the viewstate, so any changes you made on the client are lost. The reason for this is that a asp.net does not expect the contents of a listbox to be modified on the client, it only expects a selection to be made, so it discards any changes you might have made.
最好的选择是像推荐的那样使用更新面板。另一个选择,如果你真的需要这样做的客户端,是使用普通的<select>而不是<asp:ListBox>,并保持你的项目列表在一个隐藏字段。当页面在客户端上呈现时,您可以从文本字段内容的分割中填充它。
然后,当您准备发布它时,您从修改后的<select>中重新填充隐藏字段的内容。然后,当然,您必须在服务器上再次分割它,并对您的项目做一些事情,因为您的选择现在是空的,因为它回到了服务器上。
总而言之,这是一个非常麻烦的解决方案,我并不推荐,但如果您确实需要对listBox进行客户端修改,它确实可以工作。但是,我真的建议您在走这条路之前查看一下updatePanel。
我用过DataGrid。其中一列是“选择”按钮。当我点击任何一行的“选择”按钮时,我收到了这个错误消息:
无效的回发或回调参数。事件验证使用配置或
<%@ Page EnableEventValidation="true" %>出于安全考虑,此特性验证回发或回发的参数
回调事件源自最初呈现它们的服务器控件。如果数据是有效的和预期的,则使用
ClientScriptManager。RegisterForEventValidation方法,以便注册回发或回调数据进行验证。
我改了几个密码,最后成功了。我的体验路线:
1)我把页面属性改为EnableEventValidation="false"。但这并没有起作用。(这不仅危险
出于安全原因,我的事件处理程序没有被调用:void Grid_SelectedIndexChanged(对象发送者,EventArgs e)
2)实现ClientScript。渲染方法中的RegisterForEventValidation。但这并没有起作用。
protected override void Render(HtmlTextWriter writer)
{
foreach (DataGridItem item in this.Grid.Items)
{
Page.ClientScript.RegisterForEventValidation(item.UniqueID);
foreach (TableCell cell in (item as TableRow).Cells)
{
Page.ClientScript.RegisterForEventValidation(cell.UniqueID);
foreach (System.Web.UI.Control control in cell.Controls)
{
if (control is Button)
Page.ClientScript.RegisterForEventValidation(control.UniqueID);
}
}
}
}
3)我改变了我的按钮类型在网格列从PushButton到LinkButton。它工作!(" ButtonType = " LinkButton”)。我认为如果你可以改变你的按钮到其他控件,如“LinkButton”在其他情况下,它会正常工作。
我有一个类似的问题,但我没有使用ASP。Net 1.1也没有通过javascript更新控件。
我的问题只发生在Firefox而不是IE(!)。
我在PreRender事件的下拉列表中添加了如下选项:
DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string[] opcoes = HF.value.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);
我的“HF”(隐藏字段)有换行符分隔的选项,如下所示:
HF.value = "option 1\n\roption 2\n\roption 3";
问题是HTML页面在代表下拉菜单的“选择”选项上出现了问题(我的意思是有换行符)。
所以我解决了我的问题加了一行
DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string dados = HF.Value.Replace("\r", "");
string[] opcoes = dados.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);
希望这能帮助到一些人。
在客户端使用JavaScript修改ListBox时,我也遇到了同样的问题。当您从客户端向ListBox添加页面呈现时不存在的新项时,就会发生这种情况。
我找到的修复方法是通知事件验证系统可以从客户端添加所有可能的有效项。您可以通过重写Page来实现这一点。渲染并调用Page.ClientScript.RegisterForEventValidation为你的JavaScript可以添加到列表框的每个值:
protected override void Render(HtmlTextWriter writer)
{
foreach (string val in allPossibleListBoxValues)
{
Page.ClientScript.RegisterForEventValidation(myListBox.UniqueID, val);
}
base.Render(writer);
}
如果列表框有大量潜在的有效值,这可能有点麻烦。在我的例子中,我在两个listbox之间移动项目——一个有所有可能的值,另一个最初是空的,但当用户单击按钮时,在JavaScript中用第一个值的子集填充。在这种情况下,你只需要遍历第一个列表框中的项目,并将每个项目注册到第二个列表框中:
protected override void Render(HtmlTextWriter writer)
{
foreach (ListItem i in listBoxAll.Items)
{
Page.ClientScript.RegisterForEventValidation(listBoxSelected.UniqueID, i.Value);
}
base.Render(writer);
}
如果您预先知道可以填充的数据,那么可以使用ClientScriptManager来解决这个问题。当我在以前的用户选择上使用javascript动态填充下拉框时,我遇到了这个问题。
下面是一些覆盖呈现方法(在VB和c#中)并为下拉列表ddCar声明潜在值的示例代码。
在VB:
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
Dim ClientScript As ClientScriptManager = Page.ClientScript
ClientScript.RegisterForEventValidation("ddCar", "Mercedes")
MyBase.Render(writer)
End Sub
或者c#的轻微变化可以是:
protected override void Render(HtmlTextWriter writer)
{
Page.ClientScript.RegisterForEventValidation("ddCar", "Mercedes");
base.Render(writer);
}
对于新手:这应该在文件(.vb或.cs)后面的代码中,或者如果在aspx文件中使用,您可以在<script>标记中进行包装。
(1) EnableEventValidation = " false "...................这对我没用。
(2) ClientScript.RegisterForEventValidation……这对我没用。
解决方案1:
在GridView中将Button/ImageButton更改为LinkButton。它的工作原理。(但我喜欢ImageButton)
研究:Button/ImageButton和LinkButton使用不同的回发方法
原文:
http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx
解决方案2:
在OnInit()中,输入如下代码来设置Button/ImageButton的唯一ID:
protected override void OnInit(EventArgs e) {
foreach (GridViewRow grdRw in gvEvent.Rows) {
Button deleteButton = (Button)grdRw.Cells[2].Controls[1];
deleteButton.ID = "btnDelete_" + grdRw.RowIndex.ToString();
}
}
原文:
http://www.c-sharpcorner.com/Forums/Thread/35301/
The following example shows how to test the value of the IsPostBack property when the page is loaded in order to determine whether the page is being rendered for the first time or is responding to a postback. If the page is being rendered for the first time, the code calls the Page.Validate method.
The page markup (not shown) contains RequiredFieldValidator controls that display asterisks if no entry is made for a required input field. Calling Page.Validate causes the asterisks to be displayed immediately when the page is rendered, instead of waiting until the user clicks the Submit button. After a postback, you do not have to call Page.Validate, because that method is called as part of the Page life cycle.
private void Page_Load()
{
if (!IsPostBack)
{
}
}
对我们来说,问题只在生产环境中随机发生。RegisterForEventValidation没有为我们做任何事情。
最后,我们发现在asp.net应用程序运行的web场中,两台IIS服务器安装了不同的。net版本。所以看起来他们有不同的规则加密asp.net验证散列。更新它们解决了大部分问题。
另外,我们在web中配置了machineKey(compatibilityMode)(在两个服务器中相同),httpRuntime(targetFramework), ValidationSettings:UnobtrusiveValidationMode, pages(renderAllHiddenFieldsAtTopOfForm)。配置两个服务器。
我们使用该站点生成密钥https://www.allkeysgenerator.com/Random/ASP-Net-MachineKey-Generator.aspx
我们花了很多时间来解决这个问题,我希望这对大家有所帮助。
<appSettings>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
...
</appSettings>
<system.web>
<machineKey compatibilityMode="Framework45" decryptionKey="somekey" validationKey="otherkey" validation="SHA1" decryption="AES />
<pages [...] controlRenderingCompatibilityVersion="4.0" enableEventValidation="true" renderAllHiddenFieldsAtTopOfForm="true" />
<httpRuntime [...] requestValidationMode="2.0" targetFramework="4.5" />
...
</system.web>