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作为最新版本,问题仍然存在。
问题解决了
我没有意识到的是,当部分页面回发发生时,我动态创建的字段都没有填充。看完这个之后:
- 为什么动态创建的控件在回发后消失
我发现控件需要在页面加载之前重新初始化,即在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; }
以便它只尝试获取部分页面回发的值,而不是完整页面的值,例如当页面首次加载时