FileUpload в FormView внутри UpdatePanel - PullRequest
       24

FileUpload в FormView внутри UpdatePanel

4 голосов
/ 24 августа 2010

Сценарий:
У меня есть веб-страница ASP.Net, которую я намереваюсь использовать, чтобы позволить пользователю (не реальным пользователям, а в основном менеджеру контента) вставлять и редактировать записи в таблице с помощью FormView. Этот FormView находится внутри UpdatePanel, так как я также использую каскадные выпадающие списки, чтобы позволить пользователю выбрать некоторые значения.

Теперь этот FormView также содержит 4 элемента управления FileUpload, и, как вы, возможно, знаете, эти элементы управления загрузкой файлов требуют полной обратной передачи, поскольку большинство браузеров не позволяют Javascript обращаться к диску. Таким образом, эта проблема была бы решена с помощью чего-то вроде:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
           <Triggers>
           <asp:PostBackTrigger ControlID="InsertButton" />
           <asp:PostBackTrigger ControlID="UpdateButton" />
           </Triggers>
                    <ContentTemplate>....</ContentTemplate>
</asp:UpdatePanel>

Редактировать: Забыл добавить, что загрузка файла происходит в событиях OnUpdating и OnInserting SqlDataSource.

Проблема:
Поскольку InsertButton и UpdateButton находятся внутри Formview, я не могу напрямую получить доступ к их идентификаторам через разметку. И MSDN говорит , что:

Программно добавляется PostBackTrigger управления не является поддерживается.

Пожалуйста, предложите какое-нибудь решение, чтобы сделать эту работу. Любое понимание по этому вопросу высоко ценится. Спасибо.

P.S. Для меня работоспособным решением было установить PostBackTrigger UpdatePanel как весь сам FormView:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
           <Triggers>
           <asp:PostBackTrigger ControlID="FormView1" />
           </Triggers>
                    <ContentTemplate>....</ContentTemplate>
</asp:UpdatePanel>

Но теперь из-за небольшого изменения требований это решение (если вы назовете его решением) неприемлемо.

Ответы [ 3 ]

3 голосов
/ 24 августа 2010

Вы когда-нибудь думали об использовании Iframe для обратной передачи? что-то вроде:

<iframe name="uploader" id=uploader 
          src="uploaderSender.aspx?AllowedExtension=<%= AllowedExtension %>&StoringPath=<%= StoringPath %>&StoringFileName=<%= StoringFileName %>&OldFileName=<%= OldFileName %>&MaximumSize=<%= MaximumSize %>"
         width="450" height="50" frameborder=0  scrolling=no >
        </iframe>

с uploaderSender.aspx как:

<form action="UploaderReceiver.aspx" method="post"  enctype="multipart/form-data">
 <input type="file" name="file" id="file"  onchange="document.getElementById('IsFileUploading').style.visibility = 'visible'; document.forms[0].submit()"/>

    <span id="IsFileUploading" style="visibility: hidden">
        <asp:Image ID="Image1" runat="server" ImageUrl="~/immagini/Ajax-loader.gif" />
    </span>
</form>

и UploaderReceiver.aspx, например:

protected void Page_Load(object sender, EventArgs e)
        {

            //if there is one file to process
            if (Request.Files.Count > 0)
                //create the folder if it does'nt exists and returns the local path to get it
                string StoringPathToBeSaved = StoringPath.GetFolderPath();

                // append the name of the file to upload to the path.
                            StoringPathToBeSaved = StoringPathToBeSaved + StoringFileName + Extension;

                            Request.Files[0].SaveAs(StoringPathToBeSaved);

        }

это всего лишь кусочки кода, чтобы вы могли выяснить, заинтересованы ли вы в этом способе загрузки, я могу дать вам больше, если вы захотите после.

увидимся, и удачи вам с кодом,

2 голосов
/ 24 августа 2010

Ура !! Наконец-то получил его на работу!

Вот как:

Ну, вопреки тому, что говорит MSDN, мы фактически можем программно добавлять триггеры PostBack. Не обязательно до UpdatePanel, но до ScriptManager.

После нескольких часов тренировок вот что сработало:

Мы не можем получить доступ к элементам управления внутри FormView, пока шаблон не будет обработан, поэтому мы можем добавлять триггеры обратной передачи только после события OnDataBound в форме просмотра.

protected void FormView1_DataBound(object sender, EventArgs e)
    {
        if (FormView1.CurrentMode == FormViewMode.Edit)
        {
            LinkButton lb = (LinkButton)FormView1.FindControl("UpdateButton");
            ScriptManager.GetCurrent(Page).RegisterPostBackControl(lb);
        }

        //Similarily you can put register the Insert LinkButton as well.
    }

И теперь, если ваша UpdatePanel вызывает ConditionalUpdate, вы можете сделать что-то вроде этого, чтобы заставить его работать:

Разметка:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
           <ContentTemplate>..
            <EditItemTemplate>
              ...
            <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" OnClick="Cause_PostBack"CommandName="Update">Update</asp:LinkButton>
             ...
            </EditItemTemplate>
           ..</ContentTemplate>
</asp:UpdatePanel>

CodeBehind:

//call this function as the OnClick Event Handler for the Controls you want to register as
//triggers.
protected void Cause_PostBack()
    {
        UpdatePanel1.Update();
    }

В противном случае, если ваша ситуация позволяет это (как это делает моя), просто установите UpdatePanel UpdateMode="Always"

0 голосов
/ 29 августа 2015

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

Вы заявили о своей проблеме как:

Поскольку InsertButton и UpdateButton находятся внутри Formview, я не могу напрямую получить доступ к их идентификаторам через разметку

Вы можете получить доступ к их идентификаторам через разметку, чтобы использовать их в качестве ControlID в PostBackTrigger. Вам просто нужно использовать имя кнопки , которое создается в html-разметке страницы, в качестве ControlID. Вы можете найти имя, созданное путем просмотра источника страницы при просмотре страницы в браузере. Обычно это имя FormView + $ + имя кнопки.

Например, допустим, у вас есть FormView с именем «FormView1», который содержит кнопку «Вставка», которой вы дали идентификатор «btnInsert» во время разработки. Если вы откроете свою страницу в браузере, чтобы просмотреть ее в реальном времени, а затем просмотреть исходный код страницы, вы заметите, что HTML-разметке кнопки будет фактически присвоено имя «FormView1 $ btnInsert».

Используйте это имя в качестве ControlID в вашем PostBackTrigger, и ваша панель обновлений будет работать.

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
       <Triggers>
             <asp:PostBackTrigger ControlID="FormView1$btnInsert" />
       </Triggers>
       <ContentTemplate>....</ContentTemplate>
</asp:UpdatePanel>
...