FileUpload控件不能正常工作'外部'AJAX更新面板,但使用Postback触发器工作'内部'?

时间:2012-07-19 11:20:49

标签: c# asp.net ajax file-upload

我希望能回答一个简单的问题。

我正在创建一个带有文件上传控件的简单表单,这个控件最初并没有在AJAX面板中使用,而且在我的生命中我无法理解为什么我的代码保持不变,无法找到FileUpload的内容控制。

<asp:Panel ID="pnlUpload" runat="server" class="workerDetailsPanelLeft" Visible="true">

<h3 class="titleHighlightStyle">Probation Documents</h3><br />
<table cellspacing="0">
<tr>
<td class="standardLabel" valign="top">Current Documents</td>
<td colspan="2">
<asp:ListBox ID="lstDocs" runat="server" Width="200px"></asp:ListBox>
</td>
</tr>
<tr>
<td>
&nbsp;
</td>
<td>
<asp:ImageButton ID="btnSelect" runat="server" SkinID="selectprobationdoc"/>
</td>
<td class="standardLabel" style ="width:200px">Select documents</td>
</tr>
<tr>
<td>
&nbsp;
</td>
</tr>
<tr>
<td class="standardLabel">Upload Documents</td>
<td colspan="2">
<asp:FileUpload ID="uplDoc" runat="server" Height="22px" Width="200px"/> 
</td>
</tr>
<tr>
<td>
&nbsp;
</td>
<td>
<asp:Button ID="btnSave" runat="server" Text="Save" OnClick="btnSave_Click" CausesValidation="False" />
</td>
</tr>
<tr>
<td>
&nbsp;
</td>
</tr>
<tr>
<td>
<asp:Label ID="lblUploadError" runat="server" Text="Probation document required" ForeColor="Red" Visible="false"></asp:Label> 
</td>
</tr>
</table>             
</asp:Panel>

原谅格式化我删除了空格!!

现在我的标记是这样的,我在FileUpload上调用.HasFile()它会返回一个空值吗?

当我添加以下内容时

<asp:UpdatePanel ID="ContentPanel" UpdateMode="Conditional" runat="server" ChildrenAsTriggers="true">
<Triggers>
<asp:PostBackTrigger ControlID="btnSave" />
</Triggers>
<ContentTemplate>
  *Markup as above*

我可以获取控件的内容。我知道Ajax更新面板存在文件上传控制问题,解决方案是添加回发触发器,但是有人可以从这个标记中看到为什么它可能会失败找到文件吗?

            if (this.uplDoc.HasFile)
        {
            String fileExtension = System.IO.Path.GetExtension(uplDoc.FileName).ToLower();
            String validExt = sAllowedExt;

            if (validExt.IndexOf("," + fileExtension + ",") != -1)
            {
                if (this.uplDoc.FileBytes.Length >= 0)
                {
                    return string.Empty;
                }
                else
                {
                    return "PROC0003";  //Invalid File Size            
                }
            }
            else
            {
                return "PROC0002"; //Invalid file type        
            }
        }

以上是检查背后的初始代码,这从未更改过更新面板。

有人可以帮我理解我错过了吗?

由于

1 个答案:

答案 0 :(得分:0)

这是一个简单的回答,

托管内容页面的母版页将这些页面包装在更新面板中,因此我的代码没有获取文件上传控件的内容,它正在进行异步回发而不是完整的回发。

非常感谢@Shai