问题描述
我们已经创建了多个用户控件(Ascx),并将其渲染到Webpart区域。同样,我们有一个包含WebPartManager的控件,该控件已在所有.aspx页中实现。
我正在开发一项功能,该功能需要使用文件上传控件在任何页面上导入生成的.webpart文件。 我正在使用devExpress fileUpload控件,并且在FileUploadComplete事件执行以下代码时。 该代码可以正常运行,但在指定区域中也不会显示任何Web部件。这是问题所在。
protected void WebPartUploadControl_FileUploadComplete(object sender,FileUploadCompleteEventArgs e)
{
string ErrorMessge = string.Empty;
if (e.UploadedFile.IsValid)
{
var xmlReader = XmlReader.Create(e.UploadedFile.FileContent);
xmlReader.Read();
System.Web.UI.WebControls.WebParts.WebPart webPart = wpManager.ImportWebPart(xmlReader,out ErrorMessge);
wpManager.AddWebPart(webPart,wpManager.Zones["Zone5"],1);
}
}
我可能缺少一些基本代码。如果有人知道答案,请帮忙。谢谢。
解决方法
我终于弄清楚了这个问题。万一将来有人遇到类似问题,这将有所帮助。
因此,这里的问题是Devexpress File-Upload控件是一个ajax控件,它进行了部分回发,因此不会更新超出其范围的页面的CatalogZone。
处理方法是:
- 创建一个新的.WebPart文件并克隆上载文件的内容。
- 重定向到引发Page_Load事件的同一页面
- 在page_Load事件中执行以上代码,以便导入。
下面是解释这一点的代码:
WebPartUploadControl_FileUploadComplete
protected void WebPartUploadControl_FileUploadComplete(object sender,FileUploadCompleteEventArgs e)
{
String WebPartFilePath = Server.MapPath("DirectoryWhereYouWantTosaveCloneFile");
String WebPartFileName = "NameOfYourCloneFile.WebPart";
string FileContent = string.Empty;
Creating Directory to store data of uploaded file(.webPart).
Session["ImportWebPartFilePath"] = $"{WebPartFilePath}/{WebPartFileName}";
if (!Directory.Exists(WebPartFilePath))
{
Directory.CreateDirectory(WebPartFilePath);
}
Reading Uploaded file Data
using (StreamReader sr = new StreamReader(e.UploadedFile.FileContent))
{
FileContent = sr.ReadToEnd();
}
//Copying File Data to the newly Created file
if (!File.Exists(Session["ImportWebPartFilePath"].ToString()))
{
File.AppendAllText(WebPartFilePath + "/" + WebPartFileName,FileContent);
}
e.CallbackData = "Page Settings Imported Successfully.";
// Response.Redirect(Request.RawUrl) does not work in while ajax callback in
devexpress
// Creating a callback to current page to trigger Page_Load event.
DevExpress.Web.ASPxWebControl.RedirectOnCallback(this.Request.Path);
}
Page_Load
if (Session["ImportWebPartFilePath"] != null)
{
//Import Webpart Settings
ImportWebPartsToCurrentPage(Session["ImportWebPartFilePath"].ToString());
File.Delete(Session["ImportWebPartFilePath"].ToString());
Session["ImportWebPartFilePath"] = null;
}
ImportWebPartsToCurrentPage
private void ImportWebPartsToCurrentPage(String FilePath)
{
string ErrorMessge = string.Empty;
//Extracting All WebParts in the file
XDocument WebPartXml = XDocument.Load(FilePath);
//Spliting the each webpart.
var WebPartDescriptions = WebPartXml.Root.Elements();
try
{
foreach (var WebPartDescription in WebPartDescriptions)
{
var xmlReader = XmlReader.Create(new StringReader(WebPartDescription.ToString()));
xmlReader.Read();
// Adding Webpart to page Catalog.
System.Web.UI.WebControls.WebParts.WebPart webPart = wpManager.ImportWebPart(xmlReader,out ErrorMessge);
//Adding webpart to the page.
if (!wpManager.WebParts.Contains(webPart))
{
wpManager.AddWebPart(webPart,wpManager.Zones["ZoneName"],0);
}
}
}
catch (Exception ex)
{
Response.Write(ex);
}
}