更新面板中的ASP.Net AjaxControlToolkit AsyncFileUpload,它是在主页c#的服务器端代码中创建的

时间:2011-12-13 13:22:56

标签: c# asp.net updatepanel ajaxcontroltoolkit asyncfileupload

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

我有一个启用Ajax的页面,向用户显示问题,然后允许在不需要整页回复的情况下前后翻阅问题,可以在页面上显示多个问题以及这些问题中的一个或者更多可能是文件上传控件。该页面使用了一个母版页,其中包含我已经修改过的表单元素,这些元素似乎表明它是一个问题。

页面和解决方案都引用了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代码上而是在服务器端加载,因此可能存在某个问题。我遇到了因为这个而没有触发的下一个和后退按钮事件的问题,并且不得不最终实际将代码添加到updatepanel以使这些控件生成事件触发器,但这不是问题控件的选项,因为它更改从页面到页面。

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

 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作为最新版本,问题仍然存在。

1 个答案:

答案 0 :(得分:1)

解决了问题

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

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

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

这样它只会尝试获取部分页面回发的值,而不是整页,例如首次加载页面时。