Обработка события AsyncFileUpload UploadComplete внутри ретранслятора

У меня есть повторитель, который среди других элементов управления имеет AsyncFileUpload и метку ошибки, встроенную в панель (обычная, а не панель обновления). В событии UploadComplete AFU мне нужно получить доступ к панели и метке; Я могу получить доступ к самому AFU, используя аргумент «отправитель»:

<asp:Repeater runat="server" ID="rpt1" ClientIDMode="Static" OnItemDataBound="rptQuestions_ItemDataBound">
    <ItemTemplate>
        < other controls>
        <asp:Panel runat="server" ID="pnlFU" clientidmode="static">
            <ajaxToolkit:AsyncFileUpload runat="server"
                ID="fuAttchedDocs" 
                clientidmode="static"
                ThrobberID="myThrobber"
                UploaderStyle="Traditional"
                OnClientUploadComplete="onClientUploadComplete"
                OnUploadedComplete="fuAttchedDocs_UploadedComplete"
                OnUploadedFileError="fuAttchedDocs_UploadedFileError" />
            <asp:Label runat="server" ID="lblError" clientidmode="static" Text="" CssClass="field-validation-error" Style="display: none" />
        </asp:Panel>
    </ItemTemplate>
</asp:Repeater>


protected void fuAttchedDocs_UploadedComplete(object sender, AsyncFileUploadEventArgs e)
{
    AsyncFileUpload fuAttchedDocs = (AsyncFileUpload)sender;

    if (fuAttchedDocs.HasFile)
    {
        // How do I access these?

        lblError.Style["display"] = "none";
        ....
        pnlFU.Style["display"] = "block";
    }
}

Как убедиться, что я получаю доступ к нужной панели и этикетке внутри ретранслятора?

Кроме того, когда нажимается кнопка «Отправить», расположенная за пределами ретранслятора, я использую следующее, чтобы убедиться, что все файлы загружены одновременно, и вызываю js-функцию sendResponse (), которая выполняет обратную передачу для обработки всех элементов ретранслятора.

<button type="submit" class="btn btn-primary btn-md" onclick="javascript:document.forms[0].encoding = 'multipart/form-data';sendResponse();">Submit Response</button>

Это кажется правильным? Я не могу проверить это, пока не выясню, как получить доступ к элементам управления внутри ретранслятора, но подумал, что уточню у вас, имеет ли это смысл или нет.


person NoBullMan    schedule 27.04.2018    source источник


Ответы (1)


Я не знаком с инструментом AsynFileUpload, но могу показать вам, как в целом получить доступ к метке на той же панели, что и элемент управления sender.

Я создал пример страницы примерно с такой же структурой:

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

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>

    <form runat="server">

        <asp:Repeater ID="repeater" runat="server">

            <ItemTemplate>

                <asp:Panel ID="ThePanel" runat="server">

                    <asp:TextBox ID="TheTextBox" OnTextChanged="TextBox_TextChanged" runat="server"></asp:TextBox>

                    <asp:Label ID="TheLabel" runat="server"></asp:Label>

                </asp:Panel>

            </ItemTemplate>

        </asp:Repeater>

        <input type="submit" />

    </form>

</body>
</html>

Вот код программной части:

using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TestRepeater
{
    public partial class Test : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                // Force the creation of three repeater items.
                repeater.DataSource = new List<string>() { "", "", "" };
                repeater.DataBind();
            }
        }

        protected void TextBox_TextChanged(object sender, EventArgs e)
        {
            TextBox textBox = (TextBox)sender;

            Label label = (Label)textBox.Parent.FindControl("TheLabel");

            label.Text = "Hello, world!";
        }
    }
}

Обычно вы получаете объект Panel, содержащий связанные элементы управления, а затем находите связанную метку.

Вот как выглядит пример на практике:

введите описание изображения здесь

Обратите внимание, что для обновления метки потребуется обратная передача. Чтобы обновить метку без обратной передачи, вам придется проделать некоторые уловки с помощью JavaScript.

person Michael Crenshaw    schedule 27.04.2018