Đối số postback hoặc gọi lại không hợp lệ. Xác thực sự kiện được bật bằng cách sử dụng '<page enableEventValidation =, đúng sự thật />'


238

Tôi nhận được lỗi sau khi tôi gửi lại một trang từ phía khách hàng. Tôi có mã JavaScript sửa đổi asp: ListBox ở phía máy khách.

Làm thế nào để chúng tôi sửa lỗi này?

Chi tiết lỗi bên dưới:

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

Không thực hiện một cơ sở dữ liệu trong sự kiện page_load.
Paul Zahra

Câu trả lời:


171

Vấn đề là ASP.NET không biết về danh sách bổ sung hoặc loại bỏ này. Bạn có một số tùy chọn (được liệt kê bên dưới):

  • Vô hiệu hóa sự kiện (ý tưởng tồi, vì bạn mất một chút bảo mật đi kèm với rất ít chi phí).
  • Sử dụng ASP.NET Ajax UpdatePanel. (Đặt hộp danh sách vào Updatepanel và kích hoạt cập nhật, nếu bạn thêm hoặc xóa hộp danh sách. Cách này xem và các trường liên quan sẽ nhận được cập nhật và sự kiện hóa sẽ vượt qua.)
  • Quên phía máy khách và sử dụng postback cổ điển và thêm hoặc xóa phía máy chủ listitems.

Tôi hi vọng cái này giúp được.


Thêm một tùy chọn: triển khai IPostBackEventHandler và gọi js __doPostBack ('<% = UniqueId.ToString ()%>', arg)
gdbdable

Dựa trên các gợi ý ở trên, tôi đặt danh sách thả xuống của mình vào một ASP.NET asp thông thường: UpdatePanel, tải lên các danh sách thả xuống trong mã phía sau và sau đó upNewRecord.Update ();
Ricardo Appleton

183

Bạn có mã trong các sự kiện Page_Load không? nếu có, thì có lẽ bằng cách thêm vào sau đây sẽ giúp.

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

Lỗi này được đưa ra khi bạn nhấp vào lệnh của mình và Page_load đang được chạy lại, trong vòng đời bình thường sẽ là Page_Load -> Nhấp vào Lệnh -> Page_Load (một lần nữa) -> Xử lý sự kiện ItemCommand


7
aha! Cảm ơn rất nhiều, đó là mẹo trong trường hợp của tôi! Tôi đã tải lại một danh sách thả xuống trong trang tải xuống, và do đó khung bị mất quyền kiểm soát các mục (những cái mới) trong ddl và cái tôi đã nhấp (không còn tồn tại nữa)
Michel

Tôi đã gặp lỗi tương tự như OP ... Tôi đang sử dụng trình hướng dẫn trong biểu mẫu của mình và tôi đang gọi bước 0 trong tải trang của mình. loại bỏ điều đó và vấn đề biến mất. Cảm ơn ...
tking

Cảm ơn rất nhiều vì câu trả lời này .... Có cùng một vấn đề và hóa ra tôi đã quên bỏ qua các postback khi tải dữ liệu vào lưới của mình ... tiết kiệm cho tôi rất nhiều thời gian
Quagmire

10
Tât nhiên! Trở lại với các biểu mẫu web từ MVC là một nỗi đau. Đây là câu trả lời đúng
Vishnoo Rath

2
Tôi đã làm điều này, nhưng nó không hoạt động với tôi vì có mã tôi phải chạy trong sự kiện page_load khi nó không phải là một postback, và vì vậy tôi vẫn gặp lỗi tương tự. Thay vào đó, việc vô hiệu hóa viewstate cho bộ lặp của tôi đã giải quyết vấn đề.
Bryan

40

Tôi đã có một kinh nghiệm với DataGrid. Một trong những cột của nó là nút "Chọn". Khi tôi nhấp vào nút "Chọn" của bất kỳ hàng nào, tôi đã nhận được thông báo lỗi này:

"Đối số gửi lại hoặc gọi lại không hợp lệ. Xác thực sự kiện được bật bằng cách sử dụng trong cấu hình hoặc <% @ Trang EnableEventValidation =" true "%> trong một trang. Đối với mục đích bảo mật, tính năng này xác minh rằng các đối số cho các sự kiện gửi lại hoặc gọi lại bắt nguồn từ điều khiển máy chủ ban đầu kết xuất chúng. Nếu dữ liệu hợp lệ và được mong đợi, hãy sử dụng phương thức ClientScriptManager.RegisterForEventValidation để đăng ký dữ liệu gửi lại hoặc gọi lại để xác thực. "

Tôi đã thay đổi một số mã, và cuối cùng tôi đã thành công. Lộ trình trải nghiệm của tôi:

1) Tôi đã thay đổi thuộc tính trang thành EnableEventValidation="false". Nhưng nó không hoạt động. (không chỉ nguy hiểm vì lý do bảo mật, trình xử lý sự kiện của tôi không được gọi là:void Grid_SelectedIndexChanged(object sender, EventArgs e)

2) Tôi thực hiện ClientScript.RegisterForEventValidationtrong phương thức Render. Nhưng nó không hoạt động.

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) Tôi đã thay đổi loại nút của mình trong cột lưới từ PushButtonsang LinkButton. Nó đã làm việc! ("ButtonType =" LinkButton "). Tôi nghĩ rằng nếu bạn có thể thay đổi nút của mình thành các điều khiển khác như" LinkButton "trong các trường hợp khác, nó sẽ hoạt động bình thường.


1
Giải pháp của tôi là từ bỏ các nút lồng trong datagrid. MS thất bại tôi một lần nữa.
Giải pháp dữ liệu Jacobs

Giải pháp của bạn là làm việc cho tôi cũng. Cảm ơn bạn. Nhưng tôi muốn biết rằng tại sao Buttonkhông hoạt động khi linkButtonlàm việc tại cùng một chương trình. Nếu vậy, chúng ta nên luôn luôn cần phải sử dụng linkButton? Làm thế nào chúng ta có thể làm cho linh hoạt hơn?
Frank Myat Thu

8
Hãy thử thêm vào nút của bạn UseSubmitBehavior = "Sai" stackoverflow.com/questions/2968525/ợi
JJschk

Awesomeeeeeee :) .. Bạn chỉ có thể học được điều này bằng kinh nghiệm .. Bạn đã chứng minh scenerio tat thực sự cho thấy Kinh nghiệm là giáo viên tốt nhất .. Ans tuyệt vời và giải thích!
saun4frsh

Trong phần ghi đè cho Render BẠN PHẢI PUT base.Render (nhà văn); cuối cùng ... nếu không nó sẽ không hoạt động!
Paul Zahra

28

Bạn thực sự sẽ muốn làm 2 hoặc 3, không vô hiệu hóa xác nhận sự kiện.

Có hai vấn đề chính với việc thêm các mục vào phía máy khách asp: listbox.

  • Đầu tiên là nó can thiệp vào xác nhận sự kiện. Những gì đã trở lại máy chủ không phải là những gì nó gửi xuống.

  • Thứ hai là ngay cả khi bạn tắt xác thực sự kiện, khi trang của bạn được đăng lại, các mục trong hộp danh sách sẽ được xây dựng lại từ chế độ xem, do đó mọi thay đổi bạn thực hiện trên máy khách sẽ bị mất. Lý do cho điều này là một asp.net không mong đợi nội dung của hộp danh sách sẽ được sửa đổi trên máy khách, nó chỉ mong đợi một lựa chọn được thực hiện, vì vậy nó sẽ loại bỏ mọi thay đổi bạn có thể đã thực hiện.

Tùy chọn tốt nhất rất có thể sử dụng bảng cập nhật như đã được đề xuất. Một tùy chọn khác, nếu bạn thực sự cần làm phía khách hàng này, là sử dụng một bản cũ <select>thay vì một<asp:ListBox> và giữ danh sách các mục của bạn trong một trường ẩn. Khi trang hiển thị trên máy khách, bạn có thể điền nó từ một phần nội dung trường văn bản của bạn.

Sau đó, khi bạn sẵn sàng đăng nó, bạn sẽ sao chép lại nội dung của trường bị ẩn từ bản sửa đổi của bạn <select> . Sau đó, tất nhiên, bạn phải phân chia lại lần nữa trên máy chủ và làm một cái gì đó với các mục của bạn, vì lựa chọn của bạn trống bây giờ khi nó quay lại máy chủ.

Nói chung, đó là một giải pháp khá cồng kềnh mà tôi không thực sự khuyên dùng, nhưng nếu bạn thực sự phải thực hiện các sửa đổi phía máy khách của listBox, thì nó vẫn hoạt động. Tuy nhiên, tôi thực sự khuyên bạn nên xem qua updatePanel trước khi đi tuyến đường này.


3
c, bạn không cần giữ các mục đã chọn trong trường ẩn, nếu bạn tạo hộp chọn runat = "server", bạn có thể đọc giá trị được đăng lại từ Request.Form [ selectid .UnqiueID]. Và nếu nhiều lựa chọn, trình duyệt sẽ đăng các giá trị dưới dạng csv. Lưu ý các mục và thuộc tính được chọn của điều khiển sẽ bị sai trên máy chủ do bạn đã sửa đổi itrmlist trên máy khách mà máy chủ không biết.
Michael

Michael, đã làm việc. miễn là bạn thêm "bội = đúng" nếu không nó sẽ chỉ cung cấp cho bạn 1 giá trị. Cảm ơn
Sameer Alibhai

1
Có cùng một vấn đề cho một danh sách thả xuống với các ký tự dòng mới. Thay đổi thành một lựa chọn làm việc hoàn hảo. Cảm ơn!
thchaver

Tôi đã sử dụng đồng bằng cũ <select>, mà giải quyết vấn đề. Bạn có thể vui lòng cho tôi biết tại sao Updatepanel mất nhiều thời gian để tải dữ liệu khi so sánh với tải dữ liệu ajax phía máy khách không?
Pranesh Janarthanan

17

Tôi gặp vấn đề tương tự với Repeater vì tôi có một trang web có điều khiển Repeater trong một trang web đã bật EnableEventValidation. Nó không tốt Tôi đã nhận được ngoại lệ liên quan đến postback không hợp lệ.

Điều làm việc với tôi là đặt EnableViewState = "false" cho Repeater. Ưu điểm là sử dụng đơn giản hơn, đơn giản như tắt xác thực sự kiện cho trang web hoặc trang web, nhưng phạm vi ít hơn nhiều so với việc tắt xác thực sự kiện.


3
Tôi đã có vấn đề chính xác này với một điều khiển web cũ. Nền tảng web / CMS của chúng tôi (sitecore) đã có một bản cập nhật lớn bật tính năng xác nhận sự kiện (trước đây đã bị tắt! Ouch!). Điều khiển lặp lại đang hiển thị hình ảnh trong một bộ sưu tập web (có các nút để sắp xếp lại chúng) và trên postback của các nút này, ngoại lệ sẽ xảy ra. Tôi đã vô hiệu hóa trạng thái xem trên các bộ lặp bằng cách sử dụng EnableViewState = "false" như bạn đã đề xuất và xin chào, nó đã hoạt động. Như những người khác đã tìm thấy, Ghi đè kết xuất () và sử dụng ClientScriptManager.RegisterForEventValidation () không hoạt động đối với tôi. CẢM ƠN BẠN!
xan

Giống như @xan tôi cũng sử dụng Sitecore và đây chính xác là những gì tôi cần.
wilsjd

Điều này cũng làm việc cho tôi. Bảng điều khiển AJAX Update cũng sẽ hoạt động tốt, nhưng nó đã quá tải mà tôi không cần trong trường hợp này, vì vậy cảm ơn bạn Umar Farooq Khawaja.
Bryan

17

Không ai ở trên làm việc cho tôi. Sau khi đào thêm tôi nhận ra tôi đã bỏ qua 2 biểu mẫu được áp dụng trên trang gây ra sự cố.

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

Xin lưu ý rằng gần đây ASP.NET đã bắt đầu xem xét iframe trong thẻ biểu mẫu có chứa thẻ biểu mẫu trong tài liệu iframe chính là khung lồng nhau. Tôi đã phải di chuyển iframe ra khỏi thẻ biểu mẫu để tránh lỗi này.


12

Tôi gặp vấn đề tương tự khi sửa đổi ListBox bằng JavaScript trên máy khách. Nó xảy ra khi bạn thêm các mục mới vào ListBox từ máy khách không có ở đó khi trang được hiển thị.

Cách khắc phục mà tôi tìm thấy là thông báo cho hệ thống xác nhận sự kiện về tất cả các mục hợp lệ có thể có thể được thêm từ máy khách. Bạn làm điều này bằng cách ghi đè Page.Render và gọi Page.ClientScript.RegisterForEventValidation cho mỗi giá trị mà JavaScript của bạn có thể thêm vào hộp danh sách:

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

Điều này có thể là một nỗi đau nếu bạn có một số lượng lớn các giá trị có khả năng hợp lệ cho hộp danh sách. Trong trường hợp của tôi, tôi đã di chuyển các mục giữa hai ListBox - một trong đó có tất cả các giá trị có thể và một giá trị ban đầu trống nhưng được điền vào một tập hợp các giá trị từ một giá trị đầu tiên trong JavaScript khi người dùng nhấp vào nút. Trong trường hợp này, bạn chỉ cần lặp qua các mục trong ListBox đầu tiên và đăng ký từng mục với hộp danh sách thứ hai:

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

9

Một cách khác không được đề cập ở đây là phân lớp ListBox

I E.

public class ListBoxNoEventValidation : ListBox 
{
}

Các khóa ClientEventValidation tắt thuộc tính System.Web.UI.SupportsEventValidation nếu bạn phân lớp nó, trừ khi bạn thêm nó trở lại một cách rõ ràng, nó sẽ không bao giờ gọi thủ tục xác nhận. Điều đó hoạt động với bất kỳ điều khiển nào và là cách duy nhất tôi tìm thấy để "vô hiệu hóa" nó trên điều khiển bằng cơ sở kiểm soát (Tức là không phải cấp độ trang).


2
Mô tả độc đáo ở đây .
Pavel Hodek

1
Tôi nghĩ rằng cách tốt nhất để giải quyết là bằng cách này. Chúng ta nên sửa nó ở cấp độ kiểm soát thay vì ở cấp độ trang và có nguy cơ bảo mật tất cả các điều khiển có liên quan +1 và cảm ơn @PavelHodek cho liên kết đó.
James Poulose

Thật không may, nếu bạn làm điều này, bất kỳ mục danh sách nào được thêm trên máy khách sẽ không được nhận ra nếu chúng là mục được chọn khi trang được đăng lại.
Jonathan Wood

9

bạn thử một cái gì đó như thế, trong trang .aspx của bạn

thêm vào

EnableEventValidation = "false"

bạn cứ thoải mái hỏi bất kỳ câu hỏi nào!


Tôi sẽ tranh luận nếu vô hiệu hóa đề nghị xác thực tích hợp trong khung để dừng nhìn thấy lỗi sẽ là giải pháp phù hợp nhất trong trường hợp này.
Jviaches

8

Nếu bạn điền DropdownList thông qua tập lệnh phía máy khách thì hãy xóa danh sách trước khi gửi biểu mẫu trở lại máy chủ; sau đó ASP.NET sẽ không phàn nàn và bảo mật sẽ vẫn còn.

Và để lấy dữ liệu được chọn từ DDL, bạn có thể đính kèm sự kiện "OnChange" vào DDL để thu thập giá trị trong Đầu vào bị ẩn hoặc trong hộp văn bản có hiển thị Style = ": none;"


+1 Dễ thực hiện. Có thể không phải là sạch nhất, nhưng đủ dễ dàng.
nutch

7

3: Tôi đã thay đổi loại nút của mình trong cột lưới từ "PushButton" thành "LinkButton". Nó đã làm việc! ("ButtonType =" LinkButton ") Tôi nghĩ rằng nếu bạn có thể thay đổi nút của mình thành các điều khiển khác như" LinkButton "trong các trường hợp khác, nó sẽ hoạt động bình thường.

Tôi ước tôi có thể bầu bạn lên, Amir (than ôi, đại diện của tôi quá thấp.) Tôi chỉ gặp vấn đề này và thay đổi điều này hoạt động như một nhà vô địch trong chế độ xem lưới của tôi. Bỏ qua một chút, tôi nghĩ mã hợp lệ là: ButtonType = "Link"

Tôi nghi ngờ điều này là do khi bạn nhấp vào 'chỉnh sửa', chỉnh sửa của bạn sẽ thay đổi thành 'cập nhật' và 'hủy', sau đó thay đổi lại thành 'chỉnh sửa' khi gửi. Và các điều khiển thay đổi này làm cho .net không thoải mái.


Mấu chốt của vấn đề này là mô hình sự kiện hóa asp.net và liệu "trang" có được khách hàng sửa đổi tại thời điểm bạn thực hiện một bài đăng lại hay không. Ý bạn là gì '..... Và những điều khiển thay đổi này làm cho .net không thoải mái' ??
Julius A

7

(1) EnableEventValidation = "false" ................... Nó không hoạt động với tôi.

(2) ClientScript.RegisterForEventValidation .... Nó không hoạt động đối với tôi.

Giải pháp 1:

Thay đổi Nút / ImageButton thành LinkButton trong GridView. Nó hoạt động. (Nhưng tôi thích ImageButton)

Nghiên cứu: Nút / ImageButton và LinkButton sử dụng các phương pháp khác nhau để gửi lại

Bài báo gốc:

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

Giải pháp 2:

Trong OnInit (), nhập mã giống như thế này để đặt ID duy nhất cho Nút / 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();           
  }
}

Bài báo gốc:

http://www.c-sharpcorner.com/Forums/Thread353495/


6

Tôi đã triển khai chế độ xem lưới lồng nhau và tôi gặp phải vấn đề tương tự. Tôi đã sử dụng LinkButton thay vì nút hình ảnh như thế này:

trước khi tôi có một cột như thế này:

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

Tôi đã thay thế như thế này.

<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

Tôi gặp vấn đề tương tự, nhưng tôi không sử dụng ASP.Net 1.1 cũng như không cập nhật điều khiển qua javascript. Vấn đề của tôi chỉ xảy ra trên Firefox chứ không phải trên IE (!).

Tôi đã thêm các tùy chọn cho DropDownList trong sự kiện PreRender như thế này:

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" (trường ẩn) của tôi có các tùy chọn được phân tách bằng dòng mới, như thế này:

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

Vấn đề là trang HTML đã bị hỏng (ý tôi là có dòng mới) trên các tùy chọn của "select" đại diện cho DropDown.

Vì vậy, tôi đã giải quyết vấn đề của mình bằng cách thêm một dòng:

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

Hy vọng điều này sẽ giúp ai đó.


4

nếu bạn thay đổi UseSubmitBehavior="True" để UseSubmitBehavior="False"vấn đề của bạn sẽ được giải quyết

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

Điều đó đã không làm việc cho tôi. Tôi đang sử dụng một nút hình ảnh và trong một bảng trong bộ lặp, vì vậy nó không hoàn toàn giống như vậy. Vô hiệu hóa viewstate của repeater làm việc cho tôi.
Bryan

3

Tôi đã có cùng một vấn đề, những gì tôi đã làm:

Chỉ cần thêm một điều kiện if(!IsPostBack)và nó hoạt động tốt :)


3

Lỗi này sẽ hiển thị mà không có postback

Thêm mã:

If(!IsPostBack){

 //do something

}

2

Trong trường hợp này, thêm id vào nút trong RowDataBound của lưới. Nó sẽ giải quyết vấn đề của bạn.


2

Một giải pháp đơn giản cho vấn đề này là sử dụng kiểm tra IsPostBack khi tải trang của bạn. Điều đó sẽ giải quyết vấn đề này.


2

Ajax UpdatePanel tạo ra nó, và tôi nghĩ đó là cách dễ nhất , bỏ qua chi phí trả sau của Ajax .


2

Tôi biết rằng đây là một bài viết siêu cũ. Giả sử rằng bạn đang gọi vào ứng dụng của mình, đây là một ý tưởng đã làm việc cho tôi:

  1. Triển khai ICallbackEventHandler trên trang của bạn
  2. Gọi ClientScriptManager.GetCallbackEventReference để gọi mã phía máy chủ của bạn
  3. Khi có thông báo lỗi, bạn có thể gọi ClientScriptManager.RegisterForEventValidation

Nếu bạn không cần toàn quyền kiểm soát, bạn có thể sử dụng bảng cập nhật sẽ thực hiện việc này cho bạn.


2

Chúng tôi gặp vấn đề tương tự khi chúng tôi đang chuyển đổi các trang ASPX thông thường của mình sang các trang Nội dung.

Trang có vấn đề này có một </form>thẻ trong một trong các phần Nội dung, do đó hai thẻ kết thúc biểu mẫu được hiển thị trong thời gian chạy gây ra sự cố này. Việc xóa thẻ kết thúc biểu mẫu bổ sung khỏi trang đã giải quyết vấn đề này.


Cảm ơn, hóa ra tôi cũng có thêm <form>các trường trong mã của mình.
Eric Kigathi

2

Nếu bạn đang sử dụng Gridview và không liên kết Gridview tại pageload bên trong! Ispostback thì lỗi này xảy ra khi bạn nhấp vào chỉnh sửa và xóa hàng trong Gridview.

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

1

Bốn phút trước tôi nhận được lỗi tương tự. Sau đó, tôi đã nghiên cứu trong một nửa giờ như bạn. Trong tất cả các diễn đàn, họ thường nói "thêm trang enableEvent .. = false hoặc true". Bất kỳ giải pháp nào được đề xuất đều không giải quyết được vấn đề của tôi cho đến khi tôi tìm thấy nó. Vấn đề không may là một nút ASP.NET. Tôi đã gỡ bỏ nó hai giây trước. Tôi đã cố gắng thay thế bằng "imagebutton", nhưng nó cũng không được chấp nhận (vì nó cũng bị lỗi tương tự).

Cuối cùng tôi đã thay thế bằng LinkButton. Nó dường như được làm việc!


1

Tôi đã sử dụng datalist và tôi đã nhận được cùng một lỗi cho nút ấn của mình. Tôi chỉ sử dụng IsPostBack để kiểm tra và điền vào các điều khiển của mình và vấn đề đã được giải quyết! Tuyệt quá!!!


1

Điều làm việc cho tôi là chuyển mã sau từ page_load sang 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

Tùy chọn tốt nhất để làm là sử dụng trường ẩn và không tắt xác thực sự kiện, cũng thay đổi mọi hộp danh sách, danh sách thả xuống để chọn với thuộc tính máy chủ runat


Việc thay đổi từ điều khiển asp thành <select id = "director" runat = "server"> thông thường rất hiệu quả. Tôi đã có thể truy cập giá trị của nó trong mã phía sau bằng cách sử dụng: ví dụ: chuỗi directorId = Request.Form [director.ID]
Baxter

1

Nếu bạn đang sử dụng bảng cập nhật Ajax. Thêm <Triggers>thẻ và bên trong nó kích hoạt Nút hoặc điều khiển gây ra hậu quả bằng cách sử dụng<asp:PostBackTrigger .../>


1

Nếu bạn biết trước dữ liệu có thể được điền, bạn có thể sử dụng ClientScriptManager để giải quyết vấn đề này. Tôi gặp vấn đề này khi tự động điền vào hộp thả xuống bằng cách sử dụng javascript trên lựa chọn người dùng trước đó.

Dưới đây là một số mã ví dụ để ghi đè phương thức kết xuất (trong VB và C #) và khai báo một giá trị tiềm năng cho danh sách thả xuống ddCar.

Trong 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

hoặc một biến thể nhỏ trong C # có thể là:

protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation("ddCar", "Mercedes");
    base.Render(writer);
}

Đối với người mới: Điều này sẽ đi vào mã phía sau tệp (.vb hoặc .cs) hoặc nếu được sử dụng trong tệp aspx, bạn có thể gói trong <script>các thẻ.


1

Đây là lý do tại sao tôi nhận được nó:

Tôi đã có một ASP: ListBox. Ban đầu nó được giấu kín. Ở phía khách hàng, tôi sẽ điền thông qua AJAX với các tùy chọn. Người dùng đã chọn một tùy chọn. Sau đó, khi nhấp vào nút Gửi, Máy chủ sẽ thấy buồn cười về ListBox, vì nó không nhớ nó có bất kỳ tùy chọn nào.

Vì vậy, những gì tôi đã làm là đảm bảo tôi xóa tất cả các tùy chọn danh sách trước khi gửi biểu mẫu trở lại máy chủ. Bằng cách đó, máy chủ đã không phàn nàn vì danh sách đã chuyển đến máy khách trống và nó trở lại trống rỗng.

Sắp xếp !!!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.