FileUpload не работает в Multiview и панели обновления - PullRequest
2 голосов
/ 02 марта 2011
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel runat="server">
<Triggers>
<asp:PostBackTrigger ControlID="Button1" />
</Triggers>
    <ContentTemplate>

<asp:MultiView ID="MultiView1" runat="server" 
                 ActiveViewIndex="0">           
    <asp:View ID="View1" runat="server">
        <asp:Button Text="next"
            runat="server" onclick="Unnamed1_Click" />
    </asp:View>
    <asp:View ID="View2" runat="server">
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" 
        style="width: 56px" />
    <asp:FileUpload ID="fileupload2" runat="server" />
    </asp:View>
</asp:MultiView>
 </ContentTemplate>
</asp:UpdatePanel>

и код позади

 protected void Button1_Click(object sender, EventArgs e)
    {
        if (fileupload2.HasFile)
        {
            //code..
        }
    }
    protected void Unnamed1_Click(object sender, EventArgs e)
    {
        MultiView1.ActiveViewIndex = 1;
    }

Когда я нажимаю кнопку 1 для загрузки изображения в первый раз, файл upload2.HasFile возвращает «false»

не обновляя страницу снова, попробуйте загрузить ту же картинку, затем fileupload2.HasFile вернет "true"

Правильно работает в View1. Проблема с видом 2

В чем проблема с загрузкой этого файла?

Ответы [ 6 ]

2 голосов
/ 02 марта 2011

Попробуйте зарегистрировать элемент управления кнопки с помощью RegisterPostBackControl в начале жизненного цикла страницы:

   protected void Page_Init(object sender, EventArgs e)
   {
       ScriptManager1.RegisterPostBackControl(Button1);
   }

Смотрите также:

FileUpload и UpdatePanel: ScriptManager.RegisterPostBackControl работает во второй раз.

1 голос
/ 14 мая 2018

Я не знаю почему, но когда я добавляю поддельный файл загрузки из мультивью, загрузка файла корректно работает внутри view2.

Я надеюсь, что это все еще может кому-то помочь

Пример кода, который должен работать, но не работает должным образом

enter image description here

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<asp:UpdatePanel runat="server">
    <ContentTemplate>  
        <asp:MultiView ActiveViewIndex="0" runat="server" ID="mv">
            <asp:View runat="server" ID="view1">
                <asp:Button ID="change" Text="Change View" runat="server" OnClick="change_Click" />
            </asp:View>

            <asp:View runat="server" ID="view2"> 
                <div id="divLogo" runat="server" class="form-group">
                    <label class="control-label">Image</label>
                    <ajaxToolkit:AsyncFileUpload ID="fileUploadImage" runat="server"
                        AllowMultiple="false" CssClass="fileUpload" PersistFile="true" />
                </div>
                <asp:Button ID="save" Text="Save" runat="server" OnClick="save_Click" />
            </asp:View>
        </asp:MultiView>
    </ContentTemplate>
</asp:UpdatePanel>

Пример кода, который работает, как ожидается, со вспомогательным поддельным файлом загрузки

enter image description here

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<asp:UpdatePanel runat="server">
    <ContentTemplate>
        <div style="display: none;">
            <ajaxToolkit:AsyncFileUpload ID="AsyncFileUploadFake" runat="server"
                AllowMultiple="false" CssClass="fileUpload" PersistFile="true" />
        </div>
        <asp:MultiView ActiveViewIndex="0" runat="server" ID="mv">
            <asp:View runat="server" ID="view1">
                <asp:Button ID="change" Text="Change View" runat="server" OnClick="change_Click" />
            </asp:View>

            <asp:View runat="server" ID="view2"> 
                <div id="divLogo" runat="server" class="form-group">
                    <label class="control-label">Image</label>
                    <ajaxToolkit:AsyncFileUpload ID="fileUploadImage" runat="server"
                        AllowMultiple="false" CssClass="fileUpload" PersistFile="true" />
                </div>
                <asp:Button ID="save" Text="Save" runat="server" OnClick="save_Click" />
            </asp:View>
        </asp:MultiView>
    </ContentTemplate>
</asp:UpdatePanel>

0 голосов
/ 24 октября 2018

Иногда вам нужно установить триггеры Postback для каждого события вокруг загрузки файла.Даже, кнопка, которая поднимает представление, где находится файл загрузки.

Итак, попробуйте это.Это должно работать.

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel runat="server">
<Triggers>
<asp:PostBackTrigger ControlID="Button1" />
</Triggers>
    <ContentTemplate>

<asp:MultiView ID="MultiView1" runat="server" 
                 ActiveViewIndex="0">           
    <asp:View ID="View1" runat="server">
        <asp:Button Text="next" id="btnNext"
            runat="server" onclick="Unnamed1_Click" />
    </asp:View>
    <asp:View ID="View2" runat="server">
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" 
        style="width: 56px" />
    <asp:FileUpload ID="fileupload2" runat="server" />
    </asp:View>
</asp:MultiView>
 </ContentTemplate>
<Triggers>
    <asp:PostBackTrigger ControlID="btnNext" />
    <asp:PostBackTrigger ControlID="Button1" />
</Triggers>
</asp:UpdatePanel>
0 голосов
/ 02 марта 2011

Получено из http://forums.asp.net/p/1105208/1689084.aspx

Чтобы использовать элемент управления FileUpload внутри элемента управления UpdatePanel, установите элемент управления обратной передачи, который передает файл в качестве элемента управления PostBackTrigger для панели.

Кроме того, вы можете использовать iframe.Конкретного кода у меня сейчас нет, но если вы захотите, я могу выкопать его, когда у меня появится возможность открыть мой старый диск.

Что касается проблемы, когда файл больше не доступенв представлении 2 вы, вероятно, могли бы попытаться сохранить файл в представлении 1, а затем извлечь его позже в представлении 2. Возможно, причина в том, что файл передается один раз в представлении 1 и никогда не передается повторно в представлении 2.

0 голосов
/ 02 марта 2011

Вы пробовали элемент управления AsyncFileUpload из AjaxControlToolkit?

http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/AsyncFileUpload/AsyncFileUpload.aspx

Классическая загрузка файлов не очень хорошо работает с AJAX и UpdatePanels.

0 голосов
/ 02 марта 2011

Скорее всего, проблема в том, что UpdatePanel «конвертирует» все запросы от элементов управления внутри него в запросы AJAX, а FileUpload не работает с AJAX. Если вы Google для "fileupload updatepanel" , вы увидите кучу статей и возможных обходных путей.

Причина, по которой он не работает в View2, заключается в том, что кнопка с идентификатором «Button1» имеет триггер, определенный в разделе триггеров UpdatePanel. Определение такого триггера для кнопки приведет к его «ajaxify», поэтому нажатие кнопки отправит запрос AJAX вместо «обычной» обратной передачи.

...