更新面板内的异步文件上载和触发回发的下拉列表无法正常工作

时间:2011-12-19 15:33:38

标签: c# jquery asp.net ajax ajaxcontroltoolkit

 <asp:AsyncFileUpload ID="AFU_Video" OnUploadedComplete="btnVidUpload_Click" 
             runat="server" UploaderStyle="Traditional" ThrobberID="aajaxLoader" />

我在update panel内部有一个Ajax异步文件上传文件,当选择文件时异步上传文件

这是上传文件的方法

protected void btnVidUpload_Click(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
    {
        lbl_VideoLinkName.Visible = true;
        if (AFU_Video.HasFile)
        {            
            //create the path to save the file to  
            string filename = AFU_Video.FileName;
            string Fullpath = Path.Combine(@"D:\Media", filename);
            AFU_Video.SaveAs(Fullpath);
            lbl_VideoLinkName.Text = "You uploaded " + AFU_Video.FileName;
            Hidd_VideoLoc.Value = filename;
        }

在方法中,我将文件的位置存储在Hidd_VideoLoc (hidden field)中,在文件上传下方,我有一个下拉列表,当值发生变化时会回发一个帖子。当下拉值更改时,文件上载将丢失文件,但文件将上载到服务器中。我希望文件名在单击提交按钮时更新数据库,但隐藏值也会丢失文件名并且为空。但该文件存在于服务器中。我试图将文件名值保存在btnVidUpload_Click的隐藏字段中,但它保存了值但是在SelectedIndexChanged上隐藏字段会丢失它的值。即使在回发后(我不想使用会话)

,如何将值存储在隐藏字段中
      <asp:DropDownList ID="ddl_Res" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddl_SelectedIndexChanged">
 </ContentTemplate>
  <Triggers>
    <asp:AsyncPostBackTrigger ControlID="ddl_Res" EventName="SelectedIndexChanged" />         
  </Triggers>

2 个答案:

答案 0 :(得分:0)

AsyncFileUpload本身就是一个异步控件。使用该控件上传文件时的含义,将其上传到服务器。

然后,如果再次点击“保存”进行上传,它将再次上传该文件,除非当fileupload控件进入服务器时它会自行清除。

不幸的是,您必须在第一次点击服务器时存储该文件。您可以使用会话或将其存储到文件系统,具有已知的ID,例如1234.tmp,然后在设置UpdatePanel时抓住它。

另外要确保清除AsyncFileUpload,这就是你要做的。在fileupload完成

 protected void AsyncFileUpload_OnUploadedComplete(object sender, 
                                     AjaxControlToolkit.AsyncFileUploadEventArgs e)
    {

        ((AsyncFileUpload)sender) // You have to save this somewhere, or the information in it


        ((AsyncFileUpload)sender).ClearAllFilesFromPersistedStore();
        ((AsyncFileUpload)sender).ClearFileFromPersistedStore();
        sender = null;
    }

然后在页面上使用一些javascript在控件的上传完成事件

function UploadComplete() {
        var btn = document.getElementById('MainContent_btnEnter');

        btn.value = "Enter";
        btn.disabled = false;
        var form1 = document.getElementById('form1');
        form1.target = "";

        document.getElementById('MainContent_upVideo').innerHTML = 'Uploaded Successfully';
        document.getElementById('MainContent_upVideo').value = '';
        document.getElementById('MainContent_upVideo_ClientState').value = '';
    }

请注意,您需要重置表单目标。另请注意,您需要清除ClientState值,并且可以在页面上添加一些已完成的文本。 MainContent只是一个ContentHolder,因此请确保为您的页面获得正确的控件名称。

答案 1 :(得分:0)

我几周前遇到同样的问题,aspx非常复杂,我不得不将filepath放入session。我建议你尝试这样做。我记得我在谷歌或堆栈上找不到任何其他解决方案。