2

我整个早上都在试图从 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()");
    }

其他答案表明控件的可见设置在真/假之间切换存在问题,但是当页面直接由 url 加载或使用应用程序中的下一步和后退按钮导航时,控件的可见性永远不会改变。

尽管这确实使我考虑到,由于控件不在页面的 aspx 代码上,而是在服务器端加载,因此那里的某个地方可能存在问题。由于这个原因,我遇到了下一个和后退按钮事件未触发的问题,最终不得不将代码实际添加到更新面板中以使这些控件触发事件,但这不是问题控件的选项,因为它会发生变化从一页到另一页。

希望解决解决方案的最后一点信息,该控件确实出现在页面上,我可以单击它并浏览到一个文件,但是当我选择了该文件时,它似乎调用了 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 作为最新版本,但问题仍然存在。

4

1 回答 1

2

问题解决了

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

我发现控件需要在页面加载之前重新初始化,即在 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; }

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

于 2011-12-13T16:44:01.517 回答