إعادة النشر أو وسيطة رد الاتصال غير صالحة.تم تمكين التحقق من صحة الحدث باستخدام '<pages EnableEventValidation=“true”/>'

StackOverflow https://stackoverflow.com/questions/228969

سؤال

أتلقى الخطأ التالي عندما أقوم بنشر صفحة من جانب العميل.لدي كود 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
هل كانت مفيدة؟

المحلول

المشكلة هي أن ASP.NET لا يتعرف على عنصر القائمة الإضافي أو المحذوف.لديك عدد من الخيارات (المذكورة أدناه):

  • تعطيل التحقق من صحة الحدث (فكرة سيئة، لأنك تفقد القليل من الأمان الذي يأتي بتكلفة قليلة جدًا).
  • استخدم ASP.NET Ajax UpdatePanel.(ضع مربع القائمة في لوحة التحديث وقم بتشغيل التحديث، إذا قمت بإضافة أو إزالة مربع القائمة.بهذه الطريقة تحصل حالة العرض والحقول ذات الصلة على التحديثات وسيتم تمرير التحقق من صحة الحدث.)
  • انسَ جانب العميل واستخدم إعادة النشر الكلاسيكية وقم بإضافة أو إزالة عناصر القائمة من جانب الخادم.

آمل أن يساعد هذا.

نصائح أخرى

هل لديك رموز فيكم Page_Load الأحداث؟ إذا كانت الإجابة بنعم، ثم ربما بإضافة التالية سوف تساعد.

if (!Page.IsPostBack)
{ //do something }

ويتم طرح هذا الخطأ عند النقر على الأمر الخاص، ويجري يدير Page_load مرة أخرى، في دورة الحياة الطبيعية ستكون Page_Load -> انقر على القيادة -> Page_Load (مرة أخرى) -> عملية ItemCommand الحدث

لقد كانت لي تجربة مع DataGrid.كان أحد أعمدته هو زر "تحديد".عندما كنت أقوم بالنقر فوق الزر "تحديد" في أي صف، تلقيت رسالة الخطأ هذه:

""إعادة النشر أو وسيطة رد الاتصال غير صالحة.يتم تمكين التحقق من صحة الحدث باستخدام التكوين أو <٪@ page enableVentValidation = "true" ٪> في صفحة.لأغراض الأمان ، تتحقق هذه الميزة من أن الوسائط التي تنشأ عن أحداث Postback أو رد الاتصال من عنصر تحكم الخادم الذي قدمها في الأصل.إذا كانت البيانات صالحة ومتوقعة ، فاستخدم طريقة ClientScriptManager.registerForevalidation من أجل تسجيل بيانات Postback أو رد الاتصال للتحقق من الصحة. "

لقد غيرت عدة رموز، وأخيرا نجحت.طريق تجربتي:

1) لقد قمت بتغيير سمة الصفحة إلى EnableEventValidation="false". لكنها لم تنجح. (ليس هذا أمرًا خطيرًا فقط من أجل الأمن ، لم يكن معالج الحدث الخاص بي يسمى: void Grid_SelectedIndexChanged(object sender, 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" في حالات أخرى، فسيعمل بشكل صحيح.

سترغب حقًا في القيام بالأمرين 2 أو 3، لا تقم بتعطيل التحقق من صحة الحدث.

هناك مشكلتان رئيسيتان عند إضافة عناصر إلى جانب عميل asp:listbox.

  • الأول هو أنه يتعارض مع التحقق من صحة الحدث.ما عاد إلى الخادم ليس ما أرسله.

  • والثاني هو أنه حتى إذا قمت بتعطيل التحقق من صحة الحدث، فعندما يتم نشر صفحتك مرة أخرى، ستتم إعادة بناء العناصر الموجودة في مربع القائمة من حالة العرض، لذلك سيتم فقدان أي تغييرات أجريتها على العميل.والسبب في ذلك هو أن asp.net لا يتوقع تعديل محتويات مربع القائمة على العميل، بل يتوقع فقط إجراء تحديد، لذا فهو يتجاهل أي تغييرات قد تكون أجريتها.

الخيار الأفضل هو على الأرجح استخدام لوحة التحديث كما هو موصى به.هناك خيار آخر، إذا كنت بحاجة حقًا إلى القيام بهذا الجانب من جانب العميل، وهو استخدام ملف old عادي <select> بدلا من <asp:ListBox>, ، وللاحتفاظ بقائمة العناصر الخاصة بك في حقل مخفي.عندما يتم عرض الصفحة على العميل، يمكنك ملؤها من خلال تقسيم محتويات حقل النص الخاص بك.

وبعد ذلك، عندما تكون مستعدًا لنشره، يمكنك إعادة ملء محتويات الحقل المخفي من الحقل المعدل <select>.بعد ذلك، بالطبع، يتعين عليك تقسيم ذلك مرة أخرى على الخادم والقيام بشيء ما بالعناصر الخاصة بك، نظرًا لأن التحديد الذي حددته أصبح فارغًا الآن بعد أن عاد إلى الخادم.

بشكل عام، إنه حل مرهق جدًا ولا أوصي به حقًا، ولكن إذا كان عليك حقًا إجراء تعديلات من جانب العميل على listBox، فهو يعمل.ومع ذلك، أود حقًا أن أوصيك بالبحث في UpdatePanel قبل السير في هذا الطريق.

وكان لي نفس المشكلة مع مكرر لأنه كان لدي صفحات الإنترنت مع جهاز تحكم مكرر في موقع على شبكة الإنترنت والتي كان EnableEventValidation التشغيل. لم يكن جيدا. الأول هو الحصول على استثناءات تتعلق إعادة النشر غير صالحة.

وماذا عملت بالنسبة لي كان من المقرر EnableViewState = "كاذبة" للمكرر. من مزايا وأنه من الأسهل استخدام، بسيطة مثل التحول التحقق من صحة الحدث قبالة لموقع على شبكة الانترنت أو صفحات الإنترنت، ولكن في نطاق أقل بكثير من التحول التحقق من صحة الحدث خارج لاما.

لا شيء مما سبق عملت بالنسبة لي. بعد أكثر حفر أدركت أنني قد يغفل 2 أشكال تطبيقها على الصفحة التي تسبب المشكلة.

<body>
<form id="form1" runat="server">
<div>
        <form action="#" method="post" class="form" role="form">
        <div>
        ...
        <asp:Button ID="submitButton" runat="server"
        </div>
</div>
</body>

كن على علم أنه في الآونة الأخيرة ASP.NET بدأت النظر في نوافذ الأطر المدمجة ضمن علامة الشكل الذي يحتوي على علامة نموذج في الوثيقة الإطار من نفسها إطار متداخلة. واضطررت الى نقل الإطار من خارج علامة نموذج لتجنب هذا الخطأ.

وكان لي نفس المشكلة عند تعديل مربع القائمة باستخدام جافا سكريبت على العميل. ويحدث ذلك عند إضافة عناصر جديدة إلى مربع القائمة من العميل التي لم تكن موجودة عندما صفحة صدر.

والإصلاح التي وجدت هو إطلاع نظام التحقق من صحة الحدث من جميع البنود صالحة المحتملة التي يمكن إضافتها من قبل العميل. يمكنك القيام بذلك عن طريق تجاوز Page.Render والدعوة Page.ClientScript.RegisterForEventValidation لكل قيمة أن جافا سكريبت الخاصة بك يمكن أن تضيف إلى مربع القائمة:

protected override void Render(HtmlTextWriter writer)
{
    foreach (string val in allPossibleListBoxValues)
    {
        Page.ClientScript.RegisterForEventValidation(myListBox.UniqueID, val);
    }
    base.Render(writer);
}

ويمكن أن يكون هذا النوع من الألم إذا كان لديك عدد كبير من القيم يحتمل أن تكون صالحة لمربع القائمة. في حالتي أنا ونقل العناصر بين اثنين من مربعات سرد - واحد يحتوي على جميع القيم الممكنة وآخر هو في البداية فارغة ولكن يحصل شغل في مع مجموعة فرعية من القيم من أول واحد في جافا سكريبت عندما ينقر المستخدم على زر. في هذه الحالة تحتاج فقط إلى تكرار خلال العناصر الموجودة في ListBoxand أولا تسجيل كل واحد مع مربع القائمة الثانية:

protected override void Render(HtmlTextWriter writer)
{
    foreach (ListItem i in listBoxAll.Items)
    {
        Page.ClientScript.RegisterForEventValidation(listBoxSelected.UniqueID, i.Value);
    }
    base.Render(writer);
}

وثمة طريقة أخرى غير المذكورة هنا هي لفئة فرعية مربع القائمة

وبمعنى آخر.

public class ListBoxNoEventValidation : ListBox 
{
}

وClientEventValidation مفاتيح قبالة System.Web.UI.SupportsEventValidation السمة إذا كنت فئة فرعية لها، إلا إذا قمت بإضافة صراحة مرة أخرى، وسوف ندعو أبدا إجراء التحقق من الصحة. الذي يعمل مع أي رقابة، وهذه هي الطريقة الوحيدة التي وجدتها على "تعطيل" على عنصر تحكم على حدة تحكم (أي ليس على مستوى الصفحة).

<اقتباس فقرة>   

و3: لقد غيرت بلدي نوع زر في الشبكة   عمود من "الضغط على زر" ل   "LinkButton". انها عملت!   ( "ButtonType =" LinkButton ") اعتقد انه اذا   يمكنك تغيير الزر الخاص بك إلى الآخر   ضوابط مثل "LinkButton" في الآخر   الحالات، فإنه يعمل بشكل صحيح.

وأتمنى أن يصوت لك، أمير (للأسف يا رب منخفض جدا.) كنت مجرد وجود هذه المشكلة وتغيير هذا عملت مثل بطل على بلدي gridview. قليلا جانبا، وأعتقد أن رمز صالح هو: ButtonType = "لينك"

وأظن أن هذا هو لأنه عندما تنقر على "تحرير"، تحرير التغييرات إلى 'تحديث' و 'إلغاء' الذي ثم تغيير إلى "تحرير" على تقديم. وهذه الضوابط تجعل التحول غير مستقر صافي.

(1) EnableEventValidation = "false"................... لا يعمل بالنسبة لي.

(2) ClientScript.RegisterForEventValidation.... لا يعمل بالنسبة لي.

الحل 1:

قم بتغيير الزر/ImageButton إلى LinkButton في GridView.إنها تعمل.(لكنني أحب ImageButton)

بحث:يستخدم Button/ImageButton وLinkButton أساليب مختلفة لإعادة النشر

المقالة الأصلية:

http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx

الحل 2:

في OnInit()، أدخل الرمز مثل هذا لتعيين معرف فريد لـ Button/ImageButton:

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/

وحاولت شيء من هذا القبيل، في صفحة .aspx الخاصة بك

وإضافة

<اقتباس فقرة>   

وEnableEventValidation = "كاذبة"

لا تتردد في طرح أي سؤال!

إذا كنت ملء دروبدوونليست من خلال البرنامج النصي العميل ثم مسح قائمة قبل إرسال النموذج إلى الخادم؛ ثم سوف ASP.NET لا يشكو وسوف الأمن لا يزال على.

وللحصول على البيانات المحددة من DDL، يمكنك إرفاق "عند_التغيير" حدث إلى DDL لجمع قيمة في إدخال مخفي أو في النص مع النمط = "العرض: لا شيء؛"

وأنا نفذت وجهة نظر شبكة متداخلة وأنا واجهت نفس المشكلة. لقد استخدمت LinkButton بدلا من زر صورة من هذا القبيل:

وقبل كان لي عمود مثل هذا:

<asp:TemplateField ItemStyle-Width="9">
  <ItemTemplate>
 <asp:ImageButton ID="ImgBtn" ImageUrl="Include/images/gridplus.gif" CommandName="Expand"
                        runat="server" />
  </ItemTemplate>
</asp:TemplateField>

ولقد حل محل من هذا القبيل.

<asp:TemplateField>
<ItemTemplate>
     <asp:LinkButton  CommandName="Expand" ID="lnkBtn"  runat="server" ><asp:Image  ID="Img"  runat="server" ImageUrl="~/Images/app/plus.gif" /></asp:LinkButton>
      </ItemTemplate>
</asp:TemplateField> 

وكان لي مشكلة مشابهة، ولكن لم أكن باستخدام ASP.Net 1.1 ولا بتحديث التحكم عن طريق جافا سكريبت. مشكلتي حدث فقط على فايرفوكس وليس على IE (!).

وأضفت خيارات لدروبدوونليست على الحدث عرض مسبق من هذا القبيل:

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" (hiddenfield) الخيارات مفصولة سطر جديد، مثل هذا:

HF.value = "option 1\n\roption 2\n\roption 3";

وكانت المشكلة أن صفحة HTML كسرت (أعني كان أسطر جديدة) على خيارات و"حدد" التي تمثل القائمة المنسدلة.

وهكذا I حل مشكلتي بلدي مضيفا سطر واحد:

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);

وهذا الأمل مساعدة شخص ما.

وإذا قمت بتغيير UseSubmitBehavior="True" إلى UseSubmitBehavior="False" سوف تحل مشكلتك

<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />

ولقد كان لي نفس المشكلة، ما فعلته:

وفقط أضاف if(!IsPostBack) حالة، وأنه يعمل على ما يرام:)

وسيظهر هذا الخطأ دون إعادة النشر

وإضافة رمز:

If(!IsPostBack){

 //do something

}

في هذه الحالة إضافة معرف للزر في RowDataBound من الشبكة. فإنه سيتم حل مشكلتك.

وهناك حل بسيط لهذه المشكلة هو استخدام على IsPostBack حدد على تحميل الصفحة الخاصة بك. والتي تساهم في حل هذه المشكلة.

اياكس UpdatePanel يجعلها، وأعتقد أن هذا هو أسهل الطريق، وتجاهل اياكس إعادة النشر تكاليف غير مباشرة.

أعلم أن هذا منشور قديم جدًا.بافتراض أنك تتصل بطلبك، إليك فكرة نجحت معي:

  1. قم بتطبيق IcallbackEventHandler على صفحتك
  2. اتصل بـ ClientScriptManager.GetCallbackEventReference لاستدعاء الكود الجانبي للخادم الخاص بك
  3. كما تنص رسالة الخطأ، يمكنك بعد ذلك الاتصال بـ ClientScriptManager.RegisterForEventValidation

إذا لم تكن بحاجة إلى التحكم الكامل، فيمكنك استخدام لوحة التحديث التي ستقوم بذلك نيابةً عنك.

وركضنا في هذه المسألة نفسها عندما كنا تحويل لدينا صفحات ASPX العادية للصفحات المحتوى.

والصفحة مع هذه القضية كان علامة </form> داخل أحد الأقسام المحتوى، وبالتالي تحولوا إلى اثنين من علامات شكل نهاية في وقت التشغيل الذي تسبب في هذه المسألة. إزالة علامة نموذج نهاية اضافية من الصفحة حل هذه المشكلة.

وقبل أربع دقائق تلقيت نفس الخطأ. ثم لقد بحثت خلال نصف ساعة واحدة مثلك. في جميع المحافل يقولونه عموما "إضافة صفحة enableEvent .. = كاذبة أو صحيح". لم أي الحل المقترح لا حل مشاكلي حتى وجدت ذلك. المشكلة هي للأسف زر ASP.NET. I إزالته ثانيتين قبل. حاولت استبدال "imagebutton"، ولكنه كان أيضا غير مقبول (لأنه أعطى نفسه خطأ).

وأخيرا لقد حل محل مع LinkButton. يبدو أن العمل!

وكنت تستخدم Datalist على وكنت الحصول على نفس الخطأ للضغط على زر بلدي. أنا فقط استخدام IsPostBack للتحقق وملء الضوابط بلدي ويتم حل المشكلة! عظيم!

وماذا عملت بالنسبة لي يتحرك التعليمات البرمجية التالية من Page_Load لpage_prerender:

lstMain.DataBind();
Image img = (Image)lstMain.Items[0].FindControl("imgMain");

// Define the name and type of the client scripts on the page.
String csname1 = "PopupScript";
Type cstype = this.GetType();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
    cs.RegisterStartupScript(cstype, csname1, "<script language=javascript> p=\"" + img.ClientID + "\"</script>");
}

والخيار الأفضل القيام به هو استخدام حقل مخفي ولا تعطيل التحقق من صحة الحدث، أيضا تغيير كل مربع القائمة، دروبدوونليست لتحديد السمة مع الخادم RUNAT

إذا كنت تستخدم لوحة تحديث اياكس. تضاف علامة <Triggers> وداخله تحريك زر أو السيطرة مما تسبب في إعادة النشر باستخدام <asp:PostBackTrigger .../>

إذا كنت تعرف مقدما البيانات التي يمكن بالسكان، يمكنك استخدام ClientScriptManager لحل هذه المشكلة. كان لي هذه المشكلة عند ملء من القائمة المنسدلة مربع حيوي باستخدام جافا سكريبت على اختيار المستخدم السابقة.

وهنا بعض رمز المثال لتجاوز أسلوب تقديم (في 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>

وكان هذا هو السبب الأول هو الحصول على ما يلي:

وكان لي ASP: مربع القائمة. في البداية كانت مخبأة. في جانب العميل وأود أن ملء ذلك عبر AJAX مع الخيارات. اختار المستخدم خيار واحد. ثم عند النقر على زر إرسال الخادم سيحصل كل مضحك عن مربع القائمة، لأنها لم تذكر ذلك وجود أي خيارات.

وهكذا ما فعلته هو للتأكد من أنني مسح كافة الخيارات قائمة قبل اعتماد النموذج مرة أخرى إلى الخادم. وبهذه الطريقة فإن الخادم لا يشكون منذ غرق قائمة إلى العميل فارغة وعاد فارغة.

والترتيب!

وكما قال نيك B والتي عملت بالنسبة لي لديك لإزالة فواصل الأسطر في بعض الحالات. نلقي نظرة على رمز:

وسيلة -خاطئة:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">
            Item 1</asp:ListItem>
    <asp:ListItem>
            Item 2</asp:ListItem>
    <asp:ListItem>
            Item 3</asp:ListItem>
</asp:DropDownList>

وسيلة من اليمين:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">Item 1</asp:ListItem>
    <asp:ListItem>Item 2</asp:ListItem>
    <asp:ListItem>Item 3</asp:ListItem>
</asp:DropDownList>

ووocurred لفقط بالنسبة لي في IE10 +

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top