gpt4 book ai didi

c# - 异步加载小部件的最佳方式是什么?

转载 作者:行者123 更新时间:2023-11-30 18:01:43 25 4
gpt4 key购买 nike

我正在尝试为我公司的内部网站模拟 iGoogle 小部件,但在回发时遇到了问题。我收到的错误是

Sys.WebForms.PageRequestManagerServerErrorException:Sys.WebForms.PageRequestManagerServerErrorException:该页面的状态信息无效,可能已损坏。

我在单击 LayoutButton1 按钮时收到此错误。奇怪的是这个错误出现在IE 9和Chrome 16上,但在Firefox 9上没有。

如何使用我的方法加载 ASPX 页面或用户控件?我错过了什么吗?有更好的方法吗?

这里是我想要的行为:

1) 用户第一次点击页面,页面完全加载。每个小部件都显示一个 ajax 加载器 gif。2) 页面完全加载后,我对每个小部件进行异步调用以加载它们的内容。每个小部件的内容都包含 ASP.NET 服务器控件,如 GridView 控件和 TreeView 控件,因此小部件内容需要是用户控件或 ASPX 页面。在我的概念验证项目中,我使用的是 ASPX 页面。3) 检索到小部件的内容后,ajax 加载器 gif 将替换为我从异步调用中收到的标记。

这是我正在使用的代码。请注意,我正在为小部件使用 Telerik ASP.NET 服务器控件(这不会对我的问题产生任何影响)。

<script type="text/javascript">
$(document).ready(function ()
{
// Wires a client-side click event to the layout buttons.
$('.layouts').find('input').live('click', function ()
{
if ($(this).attr('class') == 'layoutSelected')
{
return false;
}
else
{
return true;
}
});
});

// Load content of all widgets.
function loadAllWidgets()
{
loadWidget1();
}

// Loads widget #1.
function loadWidget1()
{
$(document).ready(function ()
{
PageMethods.LoadWidgetContent1(onWidgetContentLoadSucceeded, onWidgetContentLoadFailed);
});
}

// Widget content load success.
function onWidgetContentLoadSucceeded(result, userContext, methodName)
{
switch (methodName)
{
case "LoadWidgetContent1":
$('#Widget1').find('.widgetContent').html(result);
break;
}
}

// Widget content load fail.
function onWidgetContentLoadFailed(error, userContext, methodName)
{
alert(error);
}
</script>

<asp:ScriptManager ID="ScriptManager1" EnablePageMethods="true" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div style="padding-bottom: 10px;">
<table class="layouts">
<tr>
<td>Layout:</td>
<td><asp:Button ID="LayoutButton1" CommandArgument="1" OnClick="LayoutButton_Click" runat="server" /></td>
</tr>
</table>
</div>
<div>
<telerik:RadDockLayout ID="RadDockLayout1" runat="server">
<telerik:RadDockZone ID="RadDockZone1" CssClass="dockZone dockZoneWide" runat="server" />
</telerik:RadDockLayout>
</div>
</ContentTemplate>
</asp:UpdatePanel>

protected void LayoutButton_Click(object sender, EventArgs e)
{
var layoutNumber = Convert.ToInt32(((Button)sender).CommandArgument);

switch (layoutNumber)
{
case 1:
LayoutButton1.CssClass = "layoutSelected";
LayoutButton2.CssClass = string.Empty;
LayoutButton3.CssClass = string.Empty;
LayoutButton4.CssClass = string.Empty;

RadDockZone1.CssClass = "dockZone dockZoneWide";
RadDockZone2.CssClass = "dockZone dockZoneNormal";
RadDockZone3.CssClass = "dockZone dockZoneNormal";
RadDockZone4.CssClass = "dockZone dockZoneNormal";
RadDockZone5.CssClass = "dockZone dockZoneNormal";

RadDockZone4.Visible = true;
RadDockZone5.Visible = false;
CreateWidgets();

break;
}
}

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
CreateWidgets();
}
}

private void CreateWidgets()
{

var radDock = new RadDock
{
Closed = false,
DefaultCommands = DefaultCommands.All,
ID = "Widget 1",
Resizable = false,
Skin = "Sitefinity",
Title = "Widget 1",
};

var divTag = new HtmlGenericControl("div");
divTag.Attributes.Add("class", "widgetContent");

var image = new Image
{
CssClass = "ajaxLoader",
ImageUrl = "~/images/transparent.gif",
ToolTip = "loading..."
};

divTag.Controls.Add(image);
radDock.ContentContainer.Controls.Add(divTag);
RadDockLayout1.Controls.Add(radDock);
radDock.Dock(RadDockZone1);


ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "LoadAllWidgets", "loadAllWidgets();", true);
}

[WebMethod]
public static string LoadWidgetContent1()
{
var stringWriter = new StringWriter();
HttpContext.Current.Server.Execute("~/WidgetContent/WidgetContent1.aspx", stringWriter);
return stringWriter.ToString();
}

最佳答案

好的 - 经过几个小时和多种方法后,我认为我找到了一个很好的解决方案。我发现有效的解决方案是使用用户控件而不是 ASPX 页面。这将允许服务器标记并防止我遇到的无效 View 状态问题。我需要在代码隐藏中进行的唯一更改是像这样更新 Web 方法:

[WebMethod]
public static string LoadWidgetContent()
{
Page pageHolder = new Page();
UserControl viewControl = (UserControl)pageHolder.LoadControl("~/WidgetContent/WidgetContent.ascx");
pageHolder.Controls.Add(viewControl);

StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, output, false);

return output.ToString();
}

这种方法允许我继续使用更新面板并在页面完全加载后加载小部件。 I ended up using Scott Gu's blog as a reference .这有点过时了,但是使用网络方法的基本原则仍然成立。

关于c# - 异步加载小部件的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8794909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com