FileUpload在Multiview和updatepanel中不起作用

时间:2011-03-02 07:16:39

标签: c# asp.net ajax updatepanel multiview

<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;
    }

当我第一次点击Button1上传图片时,fileupload2.HasFile返回“false”

再没有重新刷新页面尝试上传相同的图片然后fileupload2.HasFile返回“true”

在View1中正常工作。问题在于View 2

该文件上载有什么问题?

6 个答案:

答案 0 :(得分:2)

尝试在页面生命周期的早期使用RegisterPostBackControl注册按钮控件:

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

另见:

FileUpload and UpdatePanel: ScriptManager.RegisterPostBackControl works the second time.

答案 1 :(得分:1)

我不知道为什么,但是当我从多视图中添加假上传文件时,文件上传在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>

答案 2 :(得分:0)

问题很可能是UpdatePanel将其内部控件的所有请求“转换”为AJAX请求,而FileUpload不能与AJAX一起使用。如果你Google for "fileupload updatepanel",你会看到一堆文章和可能的解决方法。

它在View2中不起作用的原因是id为“Button1”的按钮具有在UpdatePanel的触发器部分中定义的触发器。为按钮定义这样的触发器将“ajaxify”它,因此按下按钮将发送AJAX请求而不是“正常”回发。

答案 3 :(得分:0)

您是否尝试过AjaxControlToolkit中的AsyncFileUpload控件?

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

Classic FileUpload与AJAX和UpdatePanels不能很好地协同工作。

答案 4 :(得分:0)

http://forums.asp.net/p/1105208/1689084.aspx获得

  

在一个内部使用FileUpload控件   UpdatePanel控件,设置回发   将文件提交为a的控件   面板的PostBackTrigger控件。

或者,您可以使用iframe。具体的代码现在不在我身边,但是如果你想要它,我可以在有机会打开我的旧驱动器的时候把它挖出来。

对于视图2中文件不再可用时的问题,您可能会尝试将文件保存在View 1中,然后在View 2中检索它。原因可能是因为文件在视图中提交一次1并且从未在视图2中重新提交。

答案 5 :(得分:0)

有时,您必须为文件上传周围的每个事件设置触发器回发。甚至,该按钮也可以显示文件上传位置。

所以,尝试一下。应该可以。

<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>