2009-04-25 40 views
9

Tôi có trang sử dụng trang chính, một số RequiredFieldValidators và bộ mở rộng tự động hoàn thành Bộ công cụ Web. Các mã sau đây chỉ cho thấy mức tối thiểu của trang:asp: ImageButton không kích hoạt sự kiện onclick

<%@ Page Language="C#" 
    AutoEventWireup="true" 
    CodeFile="Login.aspx.cs" 
    MasterPageFile="~/master.master" 
    Inherits="Login" %> 

<asp:Content id="Content1" 
    contentplaceholderid="ContentPlaceHolder1" 
    runat="server"> 
    <asp:UpdatePanel ID="pnlUpdate" runat="server"> 
     <ContentTemplate> 
      <div> 
       <asp:ImageButton class="submitButton" 
        imageurl="images/button_submit.gif" 
        id="btnSubmit" 
        runat="server" 
        onclick="btnSubmit_ServerClick"/> 
      </div> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
</asp:Content> 

Mã-đằng sau:

protected void btnSubmit_ServerClick 
     (object sender, ImageClickEventArgs e) 
{ 
    //breakpoint here does not get hit 
} 

Thẻ <form runat="server"> là trong trang chủ. Đoạn mã trên không kích hoạt sự kiện onclick. Nếu tôi thoát khỏi trang cái và thêm một thẻ biểu mẫu vào trang, nó hoạt động. Thẻ biểu mẫu trong trang chính không được hỗ trợ hay điều này có nghĩa là hoạt động bằng cách nào đó? alt text http://digitalcopy.warnerbros.com/images/mainmenu.gif?provider=00079&disc=03403AAA-1D20-47F2-91FA-5EE632832659

+0

Câu trả lời duy nhất mà làm việc cho tôi là từ một câu hỏi khác. :) http://stackoverflow.com/a/15911261/1603799 – MiniRagnarok

Trả lời

0

Bạn phải có điều khiển trong biểu mẫu runat = server ở đâu đó, nó có thể ở trang chính hoặc tệp .aspx. Kiểm tra kỹ xem thẻ biểu mẫu trang chính có phải là runat = server

AutoEventWireup là thuộc tính cho phép cú pháp bạn đang sử dụng. Kiểm tra lại thiết lập trong Master Page, WebForm và nó cũng có thể được thiết lập trong web.config.

nếu đó doesnt làm việc, bạn luôn có thể explicilty mã nó (mà tôi thích)

<script runat=server> 

protected override void OnInit(EventArgs e) 
    { 
     btnSubmit.Click += delegate(object sender, EventArgs e1) 
     { 

     }; 
     base.OnInit(e); 
    } 

</script> 

UpdatePanel có thể gây rối với các sự kiện phía máy chủ được huy động cũng có, vì vậy hãy thử nó mà không UpdatePanel. Và tôi chắc chắn bạn có một ScriptManager trong Trang chính

+0

Trang chính cũng có AutoEventWireup = true và web.config không ghi đè lên nó. Rất tiếc. – cdonner

+0

Tôi đã chuyển thẻ biểu mẫu (và trình quản lý tập lệnh) ra khỏi trang chính và vào trang nội dung. Sự kiện này hiện đang cháy và tôi vẫn còn trang chính. Không phải lý tưởng, nhưng vẫn còn đủ cách giải quyết. – cdonner

+0

Nếu bạn có UpdatePanel trong trang chính của mình, hãy thử xóa nó –

0

Từ mã bạn đã cung cấp, có vẻ như bạn đang thiếu <asp:scriptmanager> từ trang của mình. Bạn phải thực hiện một trong các thao tác sau:

  1. <asp:scriptmanagerproxy> trên trang và <asp:scriptmanager> trên trang chính.
  2. <asp:scriptmanager> trên trang của bạn và không <asp:scriptmanager> trên trang chính.

Cá nhân, tôi khuyên bạn nên có thẻ <form> trên trang chính, nhưng đó là tùy chọn cá nhân.

+0

Điểm tuyệt vời. Thêm một scriptmanagerproxy đã không giúp đỡ mặc dù. Tôi đặt biểu mẫu trở lại trên trang cái và giữ trình quản lý tập lệnh trên trang nội dung, cũng không hoạt động. Nó chỉ hoạt động nếu cả biểu mẫu và thẻ scriptmanager đều nằm trên trang nội dung. Kỳ dị. – cdonner

0

Bạn luôn có thể thử dùng UpdatePanel và xem nó có hoạt động không. Tôi thường bắt đầu mà không có UpdatePanel, có được tất cả mọi thứ làm việc theo cách tôi muốn và sau đó thêm vào UpdatePanel và gỡ lỗi bất cứ điều gì gây ra.

Biểu mẫu trong MasterPage hoạt động đối với tôi do đó ScriptManager/ScriptManagerProxy được đề cập bởi @Keltex có thể là một vấn đề, mặc dù tôi quên chúng đôi khi và thường đi với nó.

Với UpdatePanel, sự kiện nhấp của nút sẽ được xử lý qua Javascript, vì vậy bạn có thể lấy FireBug hoặc tương đương (tùy thuộc vào trình duyệt) và thực hiện theo những gì đang diễn ra. Có phải nó đang vấp phải việc xác thực và bạn không thấy nó? Có một lỗi JS ở đâu đó (Bộ công cụ kiểm soát không hoàn hảo luôn)? Trang có thực sự đăng lại không và không nhấn vào trình xử lý sự kiện?

+0

Tôi đã làm strep thông qua JS và thấy sự kiện đang được xử lý, và không có ngoại lệ lớn lên. Tại sao nó không nhận được gửi đến máy chủ là không rõ ràng với tôi. Tôi sẽ phải đào sâu hơn vào mã phía máy khách được tạo ra để hiểu nó. Xóa UpdatePanel không thay đổi hành vi. – cdonner

+0

Điều gì xảy ra nếu bạn hoán đổi nút bình thường cho nút hình ảnh? Nó có hoạt động không? Nó có hoạt động giống nhau trong tất cả các trình duyệt không? – Jared

+0

Đọc bình luận của bạn chặt chẽ hơn nó có vẻ giống như một vấn đề validator/JS, vì nó không làm cho nó trở lại máy chủ. Bạn có bất kỳ điều khiển nào khác như điều khiển Bộ công cụ kiểm soát có thể ảnh hưởng đến Nút hình ảnh không? – Jared

11

Bạn cũng có thể kiểm tra xem ImageButton của bạn có kích hoạt xác thực hay không. Nếu nó đặt thuộc tính CausesValidation của nó thành false (tất nhiên nếu nó có ý nghĩa).

+0

Nó kích hoạt xác nhận, bởi vì nó hoạt động tốt với cách giải quyết tại chỗ. – cdonner

0

Trên trang web của tôi, tôi đang tạo các imagebutton tự động bên trong bảng được chứa bởi một bảng cập nhật.Các nút được tạo ra bởi mã này:

for (int i = 0; i < 15; i++) 
    { 
     TableRow tr = new TableRow(); 
     for (int j = 0; j < 20; j++) 
     { 
      TableCell tc = new TableCell(); 
      ImageButton ib = new ImageButton(); 
      ib.Click += new ImageClickEventHandler(ImageButton1_Click); 
      ib.ImageUrl = "../img/defaultCell.jpg"; 
      ib.ID = i + ":" + j; 
      tc.Controls.Add(ib); 
      tc.Width = 25; 
      tc.Height = 25; 
      tr.Cells.Add(tc); 
     } 
     GameTable.Rows.Add(tr); 
    } 

}

các nút hình ảnh sẽ không kích hoạt bấm các sự kiện. HÃY BAO GIỜ, nếu dòng 'ib.ID = ...' được nhận xét, họ sẽ làm! Sự thay đổi đơn lẻ đó dường như khắc phục tất cả các vấn đề. Tôi không biết tại sao. Nếu bất kỳ ai cũng có thể giải thích điều này và cũng cho tôi biết cách kích hoạt các sự kiện giữ khả năng đặt id của nút, tôi sẽ cảm ơn nhiều hơn

+3

Bạn nên đăng câu hỏi này dưới dạng câu hỏi riêng, không phải là câu trả lời. –

0

Tôi nghĩ rằng điều đó có thể liên quan đến việc bạn chỉ định lại id sau khi tạo & gán trình xử lý sự kiện?

Thậm chí bạn có cần chỉ định id không? - Chắc chắn điều này được thực hiện cho bạn không? - Loại bỏ đúng 'ib.ID = i + ":" + j;'

3

Tôi gặp sự cố tương tự (kịch bản khác). Tôi đã sử dụng Page.RegisterRequiresRaiseEvent(ImageButton) và sự kiện onclick của tôi bắt đầu kích hoạt. Tại sao tôi cần phải làm điều đó? Tôi không biết.

2

Tôi gặp sự cố tương tự với nút hình ảnh và tìm thấy nguyên nhân gốc rễ. Bạn đang sử dụng

"ib.ID = i + ":" + j;"

như ID của ImageButton, các ":" là tên bất hợp pháp để sử dụng, như bạn đang tạo ra nó lập trình, ASP.NET cho phép nó được tạo ra.

Khi chạy, nếu bạn nhìn vào nguồn HTML của trang, bạn sẽ thấy các ký tự đặc biệt bị bỏ qua hoặc thay thế bằng "_". Vì vậy, trang không thể tìm thấy điều khiển chính xác, do đó sự kiện sẽ không kích hoạt. Hãy thử thay đổi tên bằng văn bản thuần túy, sự kiện sẽ kích hoạt.

0

Hãy chắc chắn rằng bạn sử dụng OnClick hơn onClick

bảng cập nhật của bạn có thể được can thiệp vào postback. Hãy thử nó mà không cần UpdatePanel và xem đó có phải là thủ phạm hay không.

2

ib.ID = i + ":" + j;

nên được thay đổi để

ib.ID = i.toString()+":"+j.toString(); 

Nếu nó vẫn không hoạt động thử cách sử dụng StringBuilder để tích tụ ID và gán nó sau này để sở hữu ib.ID

0

Tôi đã có cùng một vấn đề mà sự kiện OnClick của ImageButton không kích hoạt. Nhưng vấn đề thực tế là ở cấp mẫu, tôi có onSubmit="return false;"

3

Giải pháp của tôi là đặt CausesValidation của ImageButton thành false.

+0

Cảm ơn điều này đã chặn quá trình kích hoạt sự kiện của tôi – JsonStatham

0

Tôi đang đối mặt với cùng một vấn đề, nơi tôi đã tạo động một ImageButton và nhấp vào sự kiện đó không kích hoạt. do đó, tôi đã tạo nút Hình ảnh trong if (IsPostBack). Bây giờ nó đang làm việc tốt. Và ngay cả khi trang được làm mới, ImageButton sẽ được giữ lại.

0

Tôi vừa giải quyết được vấn đề tương tự khi đã bật tính năng OutputCache. Khi thay đổi từ asp:ImageButton thành asp:Button, sự kiện được kích hoạt chính xác. Có lẽ asp:ImageButton có một số lỗi với OutputCache.

0

Sau khi không có đề xuất nào ở trên phù hợp với tôi, tôi đã thử một lần nữa bằng cách gọi tạo nút trong OnInit(). Điều này đã khắc phục được sự cố của tôi và giờ sự kiện OnClick đang kích hoạt.

0

Đây là giải pháp mà làm việc cho tôi

Nếu bạn đang ràng buộc thông qua dữ liệu ràng buộc các điều khiển sau đó sử dụng theo yêu cầu attr thay vì OnClick attr

Các vấn đề liên quan