อาร์กิวเมนต์ postback หรือ callback ไม่ถูกต้อง การตรวจสอบเหตุการณ์เปิดใช้งานโดยใช้ '<pages enableEventValidation =“ true” />'


238

ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันโพสต์กลับจากลูกค้าฝั่ง ฉันมีรหัสจาวาสคริปต์ที่ปรับเปลี่ยน ASP: กล่องรายการทางฝั่งไคลเอ็นต์

เราจะแก้ไขได้อย่างไร

รายละเอียดข้อผิดพลาดด้านล่าง:

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

ห้ามดำเนินการฐานข้อมูลในเหตุการณ์ page_load
พอล Zahra

คำตอบ:


171

ปัญหาคือว่า ASP.NET ไม่ได้รับรู้เกี่ยวกับรายการพิเศษหรือลบนี้ คุณมีตัวเลือกมากมาย (รายการด้านล่าง):

  • ปิดใช้งานการประมาณเหตุการณ์ (แนวคิดที่ไม่ดีเนื่องจากคุณสูญเสียความปลอดภัยเล็กน้อยซึ่งมาพร้อมกับค่าใช้จ่ายน้อยมาก)
  • ใช้ ASP.NET Ajax UpdatePanel (ใส่กล่องรายการใน Updatepanel และเรียกการอัปเดตถ้าคุณเพิ่มหรือลบกล่องรายการวิธีนี้จะช่วยให้ viewstate และเขตข้อมูลที่เกี่ยวข้องได้รับการอัปเดตและการประเมินเหตุการณ์จะผ่าน)
  • ลืมฝั่งไคลเอ็นต์และใช้ postback แบบคลาสสิกและเพิ่มหรือลบ listitems ฝั่งเซิร์ฟเวอร์

ฉันหวังว่านี่จะช่วยได้.


อีกหนึ่งตัวเลือก: ใช้ IPostBackEventHandler และโทร js __doPostBack ('<% = UniqueId.ToString ()%>', ARG)
gdbdable

จากคำแนะนำข้างต้นฉันวางดร็อปดาวน์ของฉันใน ASP.NET ปกติ: UpdatePanel, โหลดอัพดาวน์ดาวน์ในโค้ดด้านหลังแล้ว upNewRecord.Update ();
Ricardo Appleton

183

คุณมีรหัสในเหตุการณ์ Page_Load ของคุณหรือไม่ ถ้าใช่ก็อาจจะช่วยได้ด้วยการเพิ่มสิ่งต่อไปนี้

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

ข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณคลิกที่คำสั่งของคุณและ Page_load กำลังถูกเรียกใช้อีกครั้งในวงจรชีวิตปกติจะเป็น Page_Load -> คลิกที่คำสั่ง -> Page_Load (อีกครั้ง) -> ประมวลผล ItemCommand


7
aha! ขอบคุณมากนั่นเป็นเคล็ดลับในกรณีของฉัน! ผมโหลด DropDownList ใน pageLoad และเพื่อให้การควบคุมกรอบการหายไปของรายการ (คนใหม่) ใน DDL และหนึ่งผมคลิก (ซึ่งไม่ได้อยู่อีกต่อไป)
มิเชล

ฉันมีข้อผิดพลาดเดียวกับ OP ... ฉันใช้ตัวช่วยสร้างในแบบฟอร์มของฉันและฉันกำลังเรียกขั้นตอนที่ 0 ในการโหลดหน้าของฉัน นำสิ่งนั้นออกและปัญหาหายไป ขอบคุณ ...
ติง

ขอบคุณมากสำหรับคำตอบนี้ .... มีปัญหาเดียวกันและปรากฎว่าฉันลืมละเว้น postbacks เมื่อโหลดข้อมูลลงในกริดของฉัน ... ช่วยฉันประหยัดเวลาได้มาก
Quagmire

10
ดุจ! การกลับมาที่เว็บฟอร์มจาก MVC นั้นเป็นเรื่องเจ็บปวด นี่คือคำตอบที่ถูกต้อง
Vishnoo Rath

2
ฉันทำสิ่งนี้ แต่ไม่ได้ผลสำหรับฉันเพราะมีรหัสที่ฉันต้องเรียกใช้ในเหตุการณ์ page_load เมื่อไม่ใช่ postback ดังนั้นฉันจึงยังได้รับข้อผิดพลาดเดียวกัน การปิดใช้งาน viewstate สำหรับ repeater ของฉันแก้ไขปัญหาแทน
ไบรอัน

40

ฉันมีประสบการณ์กับ DataGrid หนึ่งในคอลัมน์นั้นคือปุ่ม "เลือก" เมื่อฉันคลิกปุ่ม "เลือก" ของแถวใดฉันได้รับข้อความแสดงข้อผิดพลาดนี้:

"ไม่ถูกต้อง postback หรืออาร์กิวเมนต์โทรกลับการตรวจสอบเหตุการณ์ถูกเปิดใช้งานโดยใช้ในการกำหนดค่าหรือ <% @ Page EnableEventValidation =" true "%> ในหน้าหนึ่ง ๆ เพื่อความปลอดภัยคุณลักษณะนี้จะตรวจสอบว่าอาร์กิวเมนต์สำหรับการย้อนกลับหรือโทรกลับเกิดจากการควบคุมเซิร์ฟเวอร์ แต่เดิมแสดงผลหากข้อมูลนั้นถูกต้องและคาดว่าจะใช้วิธี ClientScriptManager.RegisterForEventValidation เพื่อลงทะเบียนข้อมูล postback หรือ callback เพื่อตรวจสอบความถูกต้อง "

ฉันเปลี่ยนรหัสหลายชุดและในที่สุดก็ประสบความสำเร็จ เส้นทางประสบการณ์ของฉัน:

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 มันได้ผล! ("ButtonType =" LinkButton ") ฉันคิดว่าถ้าคุณสามารถเปลี่ยนปุ่มของคุณเป็นการควบคุมอื่น ๆ เช่น" LinkButton "ในกรณีอื่น ๆ มันจะทำงานได้อย่างถูกต้องLinkButton


1
ทางออกของฉันคือยอมแพ้กับปุ่มซ้อนภายในดาต้ากริด MS ทำให้ฉันล้มเหลวอีกครั้ง
Jacobs Data Solutions

โซลูชันของคุณใช้ได้สำหรับฉันเช่นกัน ขอบคุณ. แต่ฉันต้องการที่จะรู้ว่าทำไมButtonไม่ทำงานเมื่อlinkButtonทำงานในโปรแกรมเดียวกัน ถ้าเป็นเช่นนั้นเราควรจะต้องใช้เสมอlinkButton? เราจะทำให้ยืดหยุ่นได้มากกว่านี้อย่างไร?
Frank Myat Thu

8
ลองเพิ่มปุ่มของคุณ UseSubmitBehavior = "False" stackoverflow.com/questions/2968525/ …
JJschk

Awesomeeeeeee :) .. คุณสามารถเรียนรู้จากประสบการณ์นี้เท่านั้น .. คุณพิสูจน์แล้วว่าการแสดง scenerio ทททที่แท้จริงประสบการณ์เป็นครูที่ดีที่สุด .. คำตอบที่ยอดเยี่ยม!
saun4frsh

ในการแทนที่สำหรับ Render คุณต้องใส่ฐาน Render (ผู้เขียน); ในตอนท้าย ... มิฉะนั้นจะไม่ทำงาน!
พอล Zahra

28

คุณจะต้องการทำ 2 หรือ 3 อย่าปิดใช้งานการตรวจสอบเหตุการณ์

มีปัญหาหลักสองประการในการเพิ่มรายการลงใน asp: ด้านไคลเอ็นต์กล่องรายการ

  • อย่างแรกคือมันรบกวนการตรวจสอบเหตุการณ์ สิ่งที่กลับมาที่เซิร์ฟเวอร์ไม่ใช่สิ่งที่ส่งมา

  • อย่างที่สองคือแม้ว่าคุณจะปิดการใช้งานการตรวจสอบเหตุการณ์เมื่อหน้าของคุณได้รับการโพสต์กลับรายการในกล่องรายการจะถูกสร้างขึ้นใหม่จาก viewstate ดังนั้นการเปลี่ยนแปลงใด ๆ ที่คุณทำกับลูกค้าจะหายไป สาเหตุที่เป็นเช่นนี้คือ asp.net ไม่ได้คาดหวังว่าเนื้อหาของกล่องรายการที่จะแก้ไขบนไคลเอนต์มันคาดว่าจะมีการเลือกเท่านั้นจึงจะยกเลิกการเปลี่ยนแปลงใด ๆ ที่คุณอาจทำ

ตัวเลือกที่ดีที่สุดมีแนวโน้มที่จะใช้แผงอัปเดตตามที่ได้รับการแนะนำ ตัวเลือกอื่นหากคุณต้องการทำด้านไคลเอนต์นี้จริง ๆ คือการใช้แบบเก่าธรรมดา<select>แทนการ<asp:ListBox>และเก็บรายการของคุณในฟิลด์ที่ซ่อนอยู่ เมื่อหน้าแสดงผลบนไคลเอนต์คุณสามารถเติมจากแยกเนื้อหาของข้อความของคุณ

จากนั้นเมื่อคุณพร้อมที่จะโพสต์คุณ repopulate <select>เนื้อหาข้อมูลที่ซ่อนอยู่จากการแก้ไขของคุณ แน่นอนว่าคุณต้องแยกมันอีกครั้งบนเซิร์ฟเวอร์และทำบางอย่างกับรายการของคุณเนื่องจากการเลือกของคุณว่างเปล่าตอนนี้มันกลับมาอยู่บนเซิร์ฟเวอร์

สรุปแล้วมันเป็นคำตอบที่ค่อนข้างยุ่งยากซึ่งฉันไม่อยากจะแนะนำ แต่ถ้าคุณต้องทำการแก้ไขรายการกล่องรายการมันจะใช้งานได้ ฉันอยากจะแนะนำให้คุณดู updatePanel ก่อนที่จะไปเส้นทางนี้อย่างไรก็ตาม


3
c, คุณไม่จำเป็นต้องเก็บรายการที่เลือกไว้ในเขตข้อมูลที่ซ่อนอยู่หากคุณเลือกกล่อง runat = "เซิร์ฟเวอร์" คุณสามารถอ่านค่าการโพสต์ย้อนกลับจาก Request.Form [ selectid .UnqiueID] และหากมีการเลือกหลายรายการเบราว์เซอร์จะโพสต์ค่าเป็น csv บันทึกรายการและคุณสมบัติที่เลือกของตัวควบคุมจะผิดบนเซิร์ฟเวอร์เนื่องจากคุณได้แก้ไข itrmlist บนไคลเอนต์ที่เซิร์ฟเวอร์ไม่รู้
Michael

ไมเคิลนั่นใช้ได้ผล ตราบใดที่คุณเพิ่ม "multiple = true" มิฉะนั้นจะให้ 1 ค่าเท่านั้น ขอขอบคุณ
Sameer Alibhai

1
มีปัญหาเดียวกันสำหรับรายการดรอปดาวน์ที่มีอักขระบรรทัดใหม่ การเปลี่ยนเป็นการเลือกทำงานได้อย่างสมบูรณ์แบบ ขอบคุณ!
thchaver

ฉันใช้ old old ธรรมดา<select>ซึ่งแก้ไขปัญหาได้ คุณช่วยบอกฉันหน่อยได้ไหมว่าทำไม Updatepanel ใช้เวลาโหลดข้อมูลมากเมื่อเทียบกับ ajax data ฝั่งไคลเอ็นต์
Pranesh Janarthanan

17

ฉันมีปัญหาเดียวกันกับ Repeater เพราะฉันมีหน้าเว็บที่มีการควบคุม Repeater ในเว็บไซต์ที่เปิดใช้งาน EnableEventValidation มันไม่ดีเลย ฉันได้รับข้อยกเว้นที่เกี่ยวข้องกับ postback ที่ไม่ถูกต้อง

สิ่งที่ใช้ได้ผลสำหรับฉันคือตั้งค่า EnableViewState = "false" สำหรับ Repeater ข้อดีคือการใช้งานง่ายกว่าการปิดการตรวจสอบความถูกต้องของเหตุการณ์สำหรับเว็บไซต์หรือหน้าเว็บ แต่ขอบเขตนั้นน้อยกว่าการปิดการตรวจสอบความถูกต้องของเหตุการณ์ด้วยเช่นกัน


3
ฉันมีปัญหาตรงนี้กับการควบคุมเว็บแบบดั้งเดิม เว็บแพลตฟอร์ม / CMS (sitecore) ของเราได้รับการอัปเดตครั้งใหญ่ซึ่งเปิดใช้งานการตรวจสอบเหตุการณ์ (ก่อนหน้านี้ถูกปิด! Ouch!) ตัวควบคุมทวนแสดงภาพในแกลเลอรี่เว็บ (มีปุ่มเพื่อจัดเรียงใหม่) และบนหลังของปุ่มเหล่านี้ข้อยกเว้นจะเกิดขึ้น ฉันปิดการใช้งานมุมมองสถานะบนตัวทำซ้ำโดยใช้ EnableViewState = "false" ตามที่คุณแนะนำและเฮ้มันก็ทำงานได้ อย่างที่คนอื่น ๆ ค้นพบการเอาชนะ Render () และการใช้ ClientScriptManager.RegisterForEventValidation () ไม่ได้ผลสำหรับฉัน ขอบคุณ!
xan

เช่นเดียวกับ @xan ฉันยังใช้ Sitecore และนี่คือสิ่งที่ฉันต้องการ
wilsjd

สิ่งนี้ได้ผลกับฉันด้วย แผงการอัปเดต AJAX จะทำงานได้ดีเช่นกัน แต่มันมีค่าใช้จ่ายป่องที่ฉันไม่ต้องการในกรณีนี้ดังนั้นขอขอบคุณคุณอูมาฟารูคคาวาจา
ไบรอัน

17

ไม่มีข้อใดถูกเลยสำหรับฉัน หลังจากขุดมากขึ้นฉันก็ตระหนักว่าฉันได้มองข้าม 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 ได้เริ่มพิจารณา iframes ภายในแท็กฟอร์มซึ่งมีแท็กฟอร์มในเอกสาร iframe เองซึ่งเป็นเฟรมซ้อนอยู่ ฉันต้องย้าย iframe ออกจากแท็กฟอร์มเพื่อหลีกเลี่ยงข้อผิดพลาดนี้


12

ฉันมีปัญหาเดียวกันเมื่อแก้ไขกล่องรายการโดยใช้ JavaScript บนไคลเอนต์ มันเกิดขึ้นเมื่อคุณเพิ่มรายการใหม่ไปยังกล่องรายการจากลูกค้าที่ไม่ได้มีเมื่อมีการแสดงหน้า

การแก้ไขที่ฉันพบคือการแจ้งให้ระบบการตรวจสอบเหตุการณ์ของรายการที่ถูกต้องเป็นไปได้ทั้งหมดที่สามารถเพิ่มจากลูกค้า คุณทำได้โดยการแทนที่ Page.Render และเรียก Page.ClientScript.RegisterForEventValidation สำหรับแต่ละค่าที่ JavaScript ของคุณสามารถเพิ่มลงในกล่องรายการ:

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

นี่อาจเป็นความเจ็บปวดหากคุณมีค่าที่อาจเป็นไปได้สำหรับกล่องรายการจำนวนมาก ในกรณีของฉันฉันกำลังย้ายรายการระหว่างสองกล่องรายการ - หนึ่งที่มีค่าที่เป็นไปได้ทั้งหมดและอื่น ๆ ที่ว่างเปล่าเริ่มแรก แต่ได้รับการเติมด้วยชุดย่อยของค่าจากคนแรกใน JavaScript เมื่อผู้ใช้คลิกปุ่ม ในกรณีนี้คุณต้องวนซ้ำไอเท็มในกล่องรายการแรกและลงทะเบียนแต่ละรายการด้วยกล่องรายการที่สอง:

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

9

อีกวิธีหนึ่งที่ไม่ได้กล่าวถึงที่นี่คือ subclass ListBox

กล่าวคือ

public class ListBoxNoEventValidation : ListBox 
{
}

คีย์ ClientEventValidation ปิดแอตทริบิวต์ System.Web.UI.SupportsEventValidation หากคุณ subclass มันเว้นแต่ว่าคุณจะเพิ่มอย่างชัดเจนกลับมามันจะไม่เรียกรูทีนการตรวจสอบ ใช้งานได้กับการควบคุมใด ๆ และเป็นวิธีเดียวที่ฉันพบว่า "ปิดการใช้งาน" บนการควบคุมตามพื้นฐานการควบคุม (เช่นไม่ใช่ระดับหน้า)


2
อธิบายอย่างที่นี่
Pavel Hodek

1
ฉันคิดว่าวิธีที่ดีที่สุดในการจัดการคือทำสิ่งนี้ เราควรแก้ไขในระดับการควบคุมแทนระดับหน้าและเสี่ยงต่อความปลอดภัยของการควบคุมทั้งหมดที่เกี่ยวข้องกับ +1 และขอขอบคุณ @PavelHodek สำหรับลิงก์นั้น
James Poulose

น่าเสียดายที่ปรากฏว่าหากคุณทำเช่นนี้รายการใด ๆ ที่เพิ่มเข้ามาในไคลเอนต์จะไม่ได้รับการยอมรับหากถูกเลือกไว้เมื่อมีการโพสต์เพจ
Jonathan Wood

9

คุณลองอะไรทำนองนั้นในหน้า. aspx ของคุณ

เพิ่ม

EnableEventValidation = "false"

คุณรู้สึกอิสระที่จะถามคำถามใด ๆ !


ฉันจะโต้แย้งว่าการปิดการใช้งานการตรวจสอบข้อเสนอ build-in โดยกรอบเพื่อหยุดการเห็นข้อผิดพลาดจะเป็นทางออกที่เหมาะสมที่สุดในกรณีนี้
Jviaches

8

หากคุณกรอก DropdownList ผ่านสคริปต์ฝั่งไคลเอ็นต์ให้ล้างรายการก่อนส่งแบบฟอร์มกลับไปยังเซิร์ฟเวอร์ จากนั้น ASP.NET จะไม่บ่นและความปลอดภัยจะยังคงอยู่

และเพื่อรับข้อมูลที่เลือกจาก DDL คุณสามารถแนบเหตุการณ์ "OnChange" กับ DDL เพื่อรวบรวมค่าในอินพุตที่ซ่อนอยู่หรือในกล่องข้อความที่มี Style = "display: none;"


+1 ใช้งานง่าย อาจจะไม่สะอาด แต่ก็ง่ายพอ
nutsch

7

3: ฉันเปลี่ยนประเภทปุ่มในคอลัมน์กริดจาก "PushButton" เป็น "LinkButton" มันได้ผล! ("ButtonType =" LinkButton ") ฉันคิดว่าถ้าคุณสามารถเปลี่ยนปุ่มของคุณเป็นการควบคุมอื่น ๆ เช่น" LinkButton "ในกรณีอื่น ๆ มันจะทำงานได้อย่างถูกต้อง

ฉันหวังว่าฉันจะลงคะแนนให้คุณได้อาเมียร์ (อนิจจาตัวแทนของฉันต่ำเกินไป) ฉันแค่มีปัญหานี้และการเปลี่ยนแปลงนี้ทำงานเหมือนแชมป์บนกริดวิวของฉัน เพียงเล็กน้อยฉันคิดว่ารหัสที่ถูกต้องคือ: ButtonType = "Link"

ฉันสงสัยว่าเป็นเพราะเมื่อคุณคลิก 'แก้ไข' การแก้ไขของคุณจะเปลี่ยนเป็น 'อัปเดต' และ 'ยกเลิก' ซึ่งจะเปลี่ยนกลับเป็น 'แก้ไข' เมื่อส่ง และการควบคุมการขยับเหล่านี้ทำให้. net ไม่สบายใจ


ปมของปัญหานี้คือรูปแบบการประเมินค่าเหตุการณ์ asp.net และระบุว่า "หน้า" ถูกแก้ไขโดยไคลเอนต์ ณ จุดที่คุณโพสต์กลับมาหรือไม่ คุณหมายถึง '..... และการควบคุมการขยับเหล่านี้ทำให้. net uneasy' ??
Julius A

7

(1) EnableEventValidation = "false" ................... มันไม่ทำงานสำหรับฉัน

(2) ClientScript.RegisterForEventValidation .... มันไม่ทำงานสำหรับฉัน

โซลูชันที่ 1:

เปลี่ยนปุ่ม / ImageButton เป็น LinkButton ใน GridView มันได้ผล. (แต่ฉันชอบ ImageButton)

การวิจัย: ปุ่ม / ImageButton และ LinkButton ใช้วิธีการต่าง ๆ เพื่อ postback

บทความต้นฉบับ:

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

โซลูชันที่ 2:

ใน OnInit () ให้ป้อนรหัสดังนี้เพื่อตั้งค่า ID เฉพาะสำหรับปุ่ม / 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/


6

ฉันใช้มุมมองกริดที่ซ้อนกันและฉันประสบปัญหาเดียวกันฉันใช้ 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> 

5

ฉันมีปัญหาที่คล้ายกัน แต่ฉันไม่ได้ใช้ ASP.Net 1.1 หรืออัปเดตการควบคุมผ่านทางจาวาสคริปต์ ปัญหาของฉันเกิดขึ้นกับ Firefox เท่านั้นไม่ใช่ใน IE (!)

ฉันได้เพิ่มตัวเลือกใน DropDownList ในเหตุการณ์ 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" ของฉัน (hiddenfield) มีตัวเลือกคั่นด้วยบรรทัดใหม่เช่นนี้:

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

ปัญหาคือหน้า HTML เสีย (ฉันหมายถึงมีการขึ้นบรรทัดใหม่) ในตัวเลือกของ "เลือก" ที่แสดงถึง DropDown

ดังนั้นฉันจึงแก้ไขปัญหาได้โดยเพิ่มหนึ่งบรรทัด:

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

หวังว่าจะช่วยคนได้


4

หากคุณเปลี่ยนUseSubmitBehavior="True" เป็น UseSubmitBehavior="False"ปัญหาจะได้รับการแก้ไข

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

นั่นไม่ได้ผลสำหรับฉัน ฉันใช้ปุ่มกดแบบภาพและในตารางใน repeater ดังนั้นจึงไม่ใช่สถานการณ์เดียวกัน การปิดการทำงานของสถานะ repeater ของฉันทำงานได้สำหรับฉัน
ไบรอัน

3

ฉันมีปัญหาเดียวกันสิ่งที่ฉันทำ:

เพิ่งเพิ่มเงื่อนไขif(!IsPostBack)และใช้งานได้ดี :)



2

ในกรณีนี้เพิ่ม id ให้กับปุ่มใน RowDataBound ของกริด มันจะแก้ปัญหาของคุณ.


2

ทางออกที่ง่ายสำหรับปัญหานี้คือการใช้การตรวจสอบIsPostBackกับการโหลดหน้าเว็บของคุณ ที่จะแก้ปัญหานี้


2

อาแจ็กซ์UpdatePanelทำให้มันและฉันคิดว่ามันเป็นที่ง่ายที่สุดวิธีที่ไม่สนใจpostback อาแจ็กซ์ค่าใช้จ่าย


2

ฉันรู้ว่านี่เป็นโพสต์เก่าสุด สมมติว่าคุณกำลังโทรเข้าสู่แอปพลิเคชันของคุณนี่เป็นแนวคิดที่เหมาะกับฉัน:

  1. ใช้ ICallbackEventHandler บนหน้าของคุณ
  2. โทร ClientScriptManager.GetCallbackEventReference เพื่อโทรไปที่โค้ดด้านเซิร์ฟเวอร์ของคุณ
  3. ตามที่ระบุข้อความแสดงข้อผิดพลาดคุณสามารถเรียก ClientScriptManager.RegisterForEventValidation

หากคุณไม่ต้องการการควบคุมทั้งหมดคุณสามารถใช้แผงอัปเดตซึ่งจะทำสิ่งนี้ให้คุณ


2

เราพบปัญหาเดียวกันนี้เมื่อเราทำการแปลงหน้า ASPX ปกติของเราเป็นหน้าเนื้อหา

หน้าเว็บที่มีปัญหานี้มี</form>แท็กภายในหนึ่งในส่วนเนื้อหาดังนั้นแท็กสิ้นสุดสองรูปแบบจึงถูกแสดงผลในเวลาทำงานซึ่งทำให้เกิดปัญหานี้ การลบแท็กปิดท้ายแบบฟอร์มพิเศษออกจากหน้าแก้ไขปัญหานี้


ขอบคุณมันกลับกลายเป็นว่าฉันมี<form>ฟิลด์พิเศษในรหัสของฉันเช่นกัน
Eric Kigathi

2

หากคุณใช้ gridview และไม่เชื่อมโยง gridview ที่ pageload ข้างใน! ispostback ข้อผิดพลาดนี้จะเกิดขึ้นเมื่อคุณคลิกที่แก้ไขและลบแถวใน gridview

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
        bindGridview();
        }

1

สี่นาทีที่แล้วฉันได้รับข้อผิดพลาดเดียวกัน จากนั้นฉันได้วิจัยในช่วงครึ่งชั่วโมงเช่นคุณ ในฟอรัมทั้งหมดพวกเขามักจะพูดว่า "เพิ่มหน้า enableEvent .. = false หรือ true" วิธีแก้ปัญหาที่เสนอไม่ได้แก้ปัญหาของฉันจนกว่าฉันจะพบ ปัญหาน่าเสียดายที่ปุ่ม ASP.NET ฉันลบมันเมื่อสองวินาทีก่อน ฉันพยายามแทนที่ด้วย "imagebutton" แต่ก็ไม่สามารถยอมรับได้ (เพราะมันทำให้เกิดข้อผิดพลาดเดียวกัน)

LinkButtonในที่สุดฉันได้ถูกแทนที่ด้วย ดูเหมือนว่าจะทำงาน!


1

ฉันใช้ดาต้าลิสต์และได้รับข้อผิดพลาดเดียวกันสำหรับปุ่มกด ฉันเพียงแค่ใช้ IsPostBack เพื่อตรวจสอบและเติมการควบคุมของฉันและแก้ไขปัญหาได้แล้ว! ยิ่งใหญ่ !!!


1

สิ่งที่ใช้ได้ผลสำหรับฉันคือการย้ายรหัสต่อไปนี้จาก 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>");
}

1

ตัวเลือกที่ดีที่สุดที่จะทำคือใช้เขตข้อมูลที่ซ่อนอยู่และไม่ได้ปิดใช้งานการตรวจสอบเหตุการณ์เปลี่ยนทุกรายการกล่องรายการแบบหล่นลงเพื่อเลือกด้วยคุณลักษณะเซิร์ฟเวอร์ runat


การเปลี่ยนจากการควบคุม ASP เป็นปกติ <select id = "Director" runat = "เซิร์ฟเวอร์"> ทำงานได้ดี ฉันสามารถเข้าถึงคุณค่าของมันในโค้ดเบื้องหลังการใช้: ex: string directorId = Request.Form [Director.ID]
Baxter

1

หากคุณใช้แผงการอัปเดต Ajax เพิ่ม<Triggers>แท็กและด้านในจะทำให้ปุ่มหรือตัวควบคุมทำให้ postBack ใช้งาน<asp:PostBackTrigger .../>


1

หากคุณทราบล่วงหน้าถึงข้อมูลที่สามารถบรรจุคุณสามารถใช้ ClientScriptManager เพื่อแก้ไขปัญหานี้ ฉันมีปัญหานี้เมื่อมีการเติมช่องดรอปดาวน์แบบไดนามิกโดยใช้จาวาสคริปต์ในการเลือกผู้ใช้ก่อนหน้านี้

นี่คือตัวอย่างโค้ดสำหรับการแทนที่เมธอดการแสดงผล (ใน VB และ C #) และการประกาศค่าที่เป็นไปได้สำหรับ dropdownlist 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

นี่คือเหตุผลที่ฉันได้รับ:

ฉันมี ASP: กล่องรายการ ตอนแรกมันถูกซ่อนอยู่ ที่ด้านลูกค้าฉันจะเติมมันผ่าน AJAX พร้อมตัวเลือก ผู้ใช้เลือกหนึ่งตัวเลือก จากนั้นเมื่อคลิกปุ่มส่งเซิร์ฟเวอร์จะทำให้ตลกเกี่ยวกับกล่องรายการทั้งหมดเนื่องจากมันจำไม่ได้ว่ามีตัวเลือกใด ๆ

ดังนั้นสิ่งที่ฉันทำคือเพื่อให้แน่ใจว่าฉันล้างตัวเลือกรายการทั้งหมดก่อนที่จะส่งแบบฟอร์มกลับไปที่เซิร์ฟเวอร์ ด้วยวิธีนี้เซิร์ฟเวอร์ไม่ได้บ่นตั้งแต่รายการไปที่ลูกค้าว่างเปล่าและกลับมาว่างเปล่า

เรียง !!!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.