Событие в пользовательском контроле - PullRequest
0 голосов
/ 21 октября 2010

У меня проблема с событием кнопки в пользовательском веб-контроле.

Сначала у меня есть aspx, подобный этому:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AddTest.aspx.cs" Inherits="AddTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div id="divContent" runat="server">
    </div>
    </form>    
</body>
</html>

Как видите, у меня есть ScriptManager для работы с ASP.NETAJAX, div с идентификатором divContent для загрузки элементов управления, затем в коде:

protected void Page_Load(object sender, EventArgs e)
{
    divContent.Controls.Add(LoadControl("~/thitai/addtest.ascx"));
}

Я добавляю addtest.ascx в divContent, как вы видите, и это код addtest.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="addtest.ascx.cs" Inherits="thitai.addtest" %>
<asp:UpdatePanel ID="updatePanel" runat="server" ClientIDMode="Static">
    <ContentTemplate>
        <input type="button" value="Load text" onclick="updPanel('text');return false;" />
        <input type="button" value="Load image" onclick="updPanel('image');return false;" />
        <asp:HiddenField ID="hftype" runat="server" ClientIDMode="Static" />
        <div>
            <asp:PlaceHolder ID="plhControl" runat="server"></asp:PlaceHolder>
        </div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </ContentTemplate>
</asp:UpdatePanel>
<script type="text/javascript">
    function updPanel(type) {
        $("#hftype").val(type);
        __doPostBack("updatePanel", "");
    }
</script>

Каждый раз, когда я нажимаю на кнопку «Загрузить текст», я изменяю значение hfType (скрытое поле), затем выполняю обратную передачу на сервер с помощью UpdatePanel, тогда это код

protected override void OnPreRender(EventArgs e)
{
     string type = hftype.Value;
     switch (type)
     {
                case "text":
                    plhControl.Controls.Add(LoadControl("~/thitai/test/text.ascx"));
                    break;
                case "image":
                    plhControl.Controls.Add(LoadControl("~/thitai/test/image.ascx"));
                    break;
                default:
                    plhControl.Controls.Add(LoadControl("~/thitai/test/text.ascx"));
                    break;
     }
     base.OnPreRender(e);
}

Это кодtext.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="text.ascx.cs" Inherits="thitai.test.text" %>
<%@ Register Assembly="Support" Namespace="Support.CustomEditor" TagPrefix="Editor" %>
<Editor:CustomEditor ID="edNoidung" runat="server" NoScript="True" Content=""
    Height="500" ActiveMode="Design" NoUnicode="True" InitialCleanUp="False" />
<div>
    <asp:Button ID="Button1" runat="server" Text="Show HTML" 
        onclick="Button1_Click" />
</div>
<div id="showHtml" runat="server"></div>

И код позади text.ascx

protected void Button1_Click(object sender, EventArgs e)
{
    showHtml.InnerHtml = edNoidung.Content;
}

Проблема заключается в следующем: когда я нажимаю на кнопку 1, страница выполняет обратную передачу с использованием AJAX, но событие Button1_Click НЕ делаетОГОНЬ!

Есть идеи для этого?

1 Ответ

2 голосов
/ 21 октября 2010

Управляющие события всегда происходят перед Page / Control PreRender. Однако Button1 не существует до тех пор, пока не произойдет предварительный просмотр страницы (поскольку вы загружаете элемент управления в это время). Чтобы решить эту проблему, вы можете переместить загрузку элемента управления (text.ascx) в Page Load вместо prerender.

РЕДАКТИРОВАТЬ : альтернативно, вы можете прослушать данные запроса в text.ascx page_load, чтобы проверить, нажата ли кнопка. Например,

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.From[Button1.UniqueID] != null)
    {
       // button1 click, handle it
       ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...