ASP.Net AjaxControlToolkit AsyncFileUpload在更新面板中创建的服务器端代码与母版

本文关键字:服务器端 创建 代码 AjaxControlToolkit Net AsyncFileUpload 更新 ASP | 更新日期: 2023-09-27 18:17:47

我整个早上都在试图从asp.net AjaxControlToolkit中获得AsyncFileUpload控件,以在我的情况下工作,没有运气。

我有一个启用Ajax的页面,它向用户显示问题,并允许用户在问题之间来回切换,而不需要返回整个页面,可以在页面上显示多个问题,这些问题中的一个或多个可以是文件上传控件。该页面使用一个母版页,其中包含我修改的表单元素,因为许多答案似乎指向它是问题。

    https://stackoverflow.com/a/2918382/728841
  • <form id="form1" runat="server" enctype="multipart/form-data" method="post">
    

页面和解决方案都引用了AjaxControlToolkit

    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>

构建问题的代码如下

 1.  private Control _generateControl(FormFields formFieldObject, string questionID) {
 2.         logger.Debug("start of method _generateControl()");
 3.         Control genericControl = _formBLL.getControlForForm(formFieldObject);
 4.         Type typeofcontrol = genericControl.GetType();
 5.         logger.Debug(typeofcontrol.ToString());
 6.  
 7.         HtmlGenericControl controlHolder = new HtmlGenericControl("div");
 8.         controlHolder.ID = _ns + "formfieldHolder_" + formFieldObject.id;
 9.         controlHolder.Attributes.Add("class", _ns + "formfieldHolder");
 10. 
 11.        if (typeofcontrol == typeof(AsyncFileUpload))
 12         {
 13.            #region display question number and question
 14.            Label questionIDLabel = new Label();
 15.            questionIDLabel.CssClass = _ns + "questionIDLabel";
 16.            questionIDLabel.Text = questionID;
 17.            Label questionText = new Label();
 18.            questionText.CssClass = _ns + "questionText";
 19.            questionText.Text = formFieldObject.name;
 20.            #endregion
 21.
 22.            #region add holder for file upload control
 23.            HtmlGenericControl questionControlHolder = new HtmlGenericControl("div");
 24.            questionControlHolder.Attributes.Add("class", _ns + "questionControlHolder");
 25.            genericControl.ID = _ns + "questionControl_" + formFieldObject.id;
 26.            #endregion
 27.
 28.            AsyncFileUpload fuc = (AsyncFileUpload)genericControl;
 29.            fuc.ID = _ns + "questionControl_" + formFieldObject.id;
 30.            fuc.ClientIDMode = ClientIDMode.AutoID;
 31.            fuc.UploadedComplete += fileuploadClick;
 32.            fuc.UploadedFileError += fileuploadError;
 33.            questionControlHolder.Controls.Add(fuc);
 34.
 35.            // add the controls to the holder
 36.            #region add controls to page
 37.            controlHolder.Controls.Add(questionIDLabel);
 38.            controlHolder.Controls.Add(questionText);
 39.            controlHolder.Controls.Add(questionControlHolder);
 40.            #endregion
 41.        }
 42.        return controlHolder;
 43.  }

然后将控件添加到aspx页

中的占位符中。
 <asp:UpdatePanel ID="questionPanel" runat="server" UpdateMode="Conditional">     
    <ContentTemplate>           
        <asp:PlaceHolder ID="QuestionSection" runat="server">             
        </asp:PlaceHolder>
    </ContentTemplate>    
</asp:UpdatePanel>

以下是应该被调用的方法,但是从Visual Studio调试和检查日志文件中,这些方法从未被击中。

    public void fileuploadError(object sender, AsyncFileUploadEventArgs e)
    {
        logger.Debug("START method fileuploadError()");
        logger.Debug("END method fileuploadError()");
    }
    public void fileuploadClick(object sender, AsyncFileUploadEventArgs e)
    {
        logger.Debug("START method fileuploadClick()");            
        logger.Debug("END method fileuploadClick()");
    }

其他答案表明,在true/false之间切换控件的可见设置存在问题,但是当页面由url直接加载或使用应用程序中的next和back按钮导航时,控件的可见性从未改变。

虽然这确实使我认为,由于控件不在页面的aspx代码上,但加载的服务器端可能会有一个问题。我遇到了下一个和后退按钮事件不触发的问题,因此不得不最终将代码添加到这些控件的更新面板中以使事件触发,但这不是问题控件的选项,因为它会从页面更改到页面。

  • 无法让AsyncFileUpload在更新面板中工作

最后一点信息,希望解决一个解决方案,控件确实出现在页面上,我可以点击它并浏览到一个文件,但当我选择文件时,它似乎调用Page_Load,没有别的,下面两个弹出窗口出现

 Server Response Error: 'Unknown Server Error'
 Do You want to see the response page?

 Unhandled Exception: Server Response Error: 'Unknown Server Error'

在测试的所有浏览器中都会出现这种情况FF 8, Chrome 15.0和IE 9

在Firefox的firebug中,我也得到了以下可能与

相关的javaScript错误
 Index or size is negative or greater than the allowed amount
 [Break On This Error] Type.registerNamespace("Sys.Extended.U...FileUploadEventArgs",Sys.EventArgs); 

如有任何帮助,不胜感激。

编辑 13/12/2011我使用今天下载的AjaxControlToolkit版本4.1.5作为最新版本,问题仍然存在。

ASP.Net AjaxControlToolkit AsyncFileUpload在更新面板中创建的服务器端代码与母版

问题解决了

我没有意识到的是,当部分页面回发发生时,我动态创建的字段都没有填充。看完这个之后:

  • 为什么动态创建的控件在回发后消失

我发现控件需要在页面加载之前重新初始化,即在Page_Init中,我稍微改变了代码,以便在_displaySingleQuestion()方法中我告诉会话问题ID是什么,然后在Page_Init中调用该方法,因此当前问题的控件在页面上由保存方法查询。

    public void Page_Init(object sender, EventArgs e)
    {
        logger.Debug("Page_Init START");
        if (!Page.IsPostBack) { Session["qid"] = 0; }
        int qid = Convert.ToInt32(Session["qid"]);
        if (qid > 0)
        {
            _displaySingleQuestion(_formObject, qid);
        }
        logger.Debug("Page_Init END");
    }

这也意味着在页面继续之前需要重新初始化AsyncFileUpload,完成此操作后,我的日志方法现在正在记录fileuploadClick()事件被成功调用。

注意,我添加了 一行
 if (!Page.IsPostBack) { Session["qid"] = 0; }

以便它只尝试获取部分页面回发的值,而不是完整页面的值,例如当页面首次加载时