我试图在数据检索任务需要不同时间的网站上的更新面板中异步显示数据.我想更新每个面板,以在每个任务完成后显示页面上的数据.
但是,无论我尝试什么,所有更新面板在最后一个任务完成后更改其内容.
例如:
我有两个任务:
预期的结果是在5秒后只有UpdatePanel1中的标签发生变化,但是,两个更新面板同时更新,为10秒.
两个更新面板都设置为updatemode ="Conditional",并告诉他们从客户端javascript回发.以下是上述示例的完整列表.
我在这里错过了什么?如何加载一个更新面板,然后另一个,让两个任务异步运行?
谢谢,
TM值
ASPX:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body onload="partialPostback();">
<script language="JavaScript" type="text/javascript">
function partialPostback() {
__doPostBack('UpdatePanel1', '');
__doPostBack('UpdatePanel2', '');
}
</script>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"/>
5 sec:
<asp:UpdatePanel ID="UpdatePanel1" runat="server"
UpdateMode="Conditional" OnLoad="UpdatePanel1_Load">
<ContentTemplate>
<asp:Label ID="Label2" runat="server" Text="Label"/><br />
</ContentTemplate>
</asp:UpdatePanel><br />
10 sec:
<asp:UpdatePanel ID="UpdatePanel2" runat="server"
UpdateMode="Conditional" OnLoad="UpdatePanel2_Load"> …Run Code Online (Sandbox Code Playgroud) 我遇到了一个看似非常着名的问题:我的updatepanel会触发一个完整的回发而不是异步回发.正常的解决方案是给你动态添加的所有控件,我已经完成了,但我仍然得到一个完整的回发而不是我的异步回发...
这是代码:
HTML:
<asp:UpdatePanel ID="ItemsUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">
<Triggers>
</Triggers>
<ContentTemplate>
<asp:ListView ID="PlayerItems" runat="server" GroupItemCount="5"
onitemdatabound="PlayerItems_ItemDataBound">
<LayoutTemplate>
... Listview stuff ...
</asp:ListView>
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)
有趣的部分是后面的C#代码(方法PlayerItems_ItemDataBound),如下所示:
ImageButton imgBtn = new ImageButton();
imgBtn.ID = "itemBtn";
imgBtn.Width = Unit.Pixel(30);
imgBtn.ImageUrl = "~/Images/Game/Items/" + myItem.ItemImageUrl;
ContextMenu menu = new ContextMenu();
menu.BoundControls.Add(imgBtn);
menu.ItemCommand += new CommandEventHandler(menu_ItemCommand);
menu.AutoHide = true;
menu.RolloverColor = Color.Gray;
menu.ID = "MenuMenu";
Panel panel = (Panel)(e.Item.FindControl("ItemPanel"));
panel.Controls.Add(imgBtn);
panel.Controls.Add(menu);
AsyncPostBackTrigger trig = new AsyncPostBackTrigger();
trig.ControlID = menu.UniqueID;
trig.EventName = "ItemCommand";
ItemsUpdatePanel.Triggers.Add(trig);
Run Code Online (Sandbox Code Playgroud)
所以,我实际上在菜单中添加了AsyncPostBackTrigger,因此应该注册ItemCommand事件.当我在此上下文菜单中单击某个项目时发生的事情是完整的回发事件.
我一直试图在没有帮助的情况下玩ChildrenAsTriggers.我也一直在上下移动AsyncPostBackTrigger代码,也没有帮助. …
我想从Codebehind显示一个jQuery UI对话框,需要在回发后刷新它.
该对话框是一个用于过滤和查找数据的控件.因此,用户从DropDownLists中选择并在TextBoxes中输入文本,单击"Apply-Button",发生异步回发,根据用户的选择过滤数据,结果将显示在GridView中.因此,我需要更新GridView周围的UpdatePanel.
异步回发在这些链接的帮助下工作:
(基本上是dlg.parent().appendTo(jQuery("form:first"));-Solution)
问题:我无法使用UpdateMode ="Always"更新UpdatePanel,也无法通过UpdatePanel.Update()从代码隐藏手动更新UpdatePanel.我认为它与Dialog不在UpdatePanel内部或类似的东西有关.希望有人可以帮助我.
一些来源:
function createChargeFilterDialog() {
//setup dialog
$('#Dialog_ChargeFilter').dialog({
modal: true,
resizable: false,
autoOpen: false,
draggable: true,
hide: "Drop",
width: 850,
height: 600,
position: "center",
title: "Charge-Filter",
buttons: {
"Close": function () {
$(this).dialog("close");
}
},
open: function (type, data) {
$(this).parent().appendTo(jQuery("form:first"))
},
close: function (type, data) {
}
});
}
Run Code Online (Sandbox Code Playgroud)
当点击通过BtnShowDialog(在jQuery-Dialog之外)时,它会从代码隐藏中调用
AjaxControlToolkit.ToolkitScriptManager.RegisterStartupScript _
(Me.Page, GetType(Page), "showChargeFilterDialog", "createChargeFilterDialog();$('#Dialog_ChargeFilter').dialog('open');", True)
Run Code Online (Sandbox Code Playgroud)
更新:我也注意到postback-values中存在问题.所有TextBoxes如果为空或没有附加逗号.这表示根据以下内容多次呈现控件:http://www.componentart.com/community/forums/t/60999.aspx
我确信这两个问题都是相关的.将在每个异步回发中重新创建包含其所有控件的整个对话框,因此所有控件名称在DOM中存在多次(导致ViewState逗号附加问题).控件只能在FireBug/IE开发工具栏中看到,而不能在HTML-Source中看到,因此我假设jQuery会导致这些问题.如何处理对话框或如何防止对话框 …
我有一个aspx页面,由3个用户控件(ascx)组成.我有一个更新面板包装3个用户控件,如下所示:
<asp:UpdatePanel ID="UpdatePanelWrapper" runat="server">
<ContentTemplate>
<uc1:UserControl1 ID="UserControl1" runat="server" />
<uc2:UserControl2 ID="UserControl2" runat="server"/>
<uc2:UserControl3 ID="UserControl3" runat="server"/>
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)
我通过单独显示每个用户控件,因此当显示"UserControl1"时,隐藏其他2个用户控件.
在"UserControl1"里面我有一些asp控件和一些javascript函数.我的问题是,当刷新"UpdatePanelWrapper"时,永远不会调用这些javascript函数.
我已经尝试过这个解决方案http://blog.dreamlabsolutions.com/post/2009/02/24/jQuery-document-ready-and-ASP-NET-Ajax-asynchronous-postback.aspx,通过添加javascript调用内部"UserControl1"虽然不起作用.只有当我在aspx页面中添加javascript调用但不在"UserControl1"内部时,我才能使用它.
任何帮助将不胜感激,谢谢.
我在这里看到了几个关于使用Recaptcha和ASP.net UpdatePanels的其他帖子,但还没有找到解决我的问题的答案.
这是我的ASPX代码:
<asp:UpdatePanel ID="updRecaptcha" runat="server" UpdateMode="Always">
<ContentTemplate>
<recaptcha:RecaptchaControl ID="btnrecaptcha" runat="server" Theme="clean" PrivateKey"<%$ Resources: General, CaptchaPrivateKey %>" PublicKey="<%$ Resources: General, CaptchaPublicKey %>" />
<asp:Label ID="recaptchaerror" runat="server" style="color: Red;"/>
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)
因此,Recaptcha控件存在于使用多个.Net验证控件(例如RequiredFieldValidator)的用户控件中.在允许进程继续之前,我需要对Recaptcha和ASP.net控件进行验证.
如果任何验证失败(Recaptcha或.Net),则Recaptcha控件将消失.看一下HTML源代码,在Postback之后根本没有加载控件 - 尽管我告诉UpdatePanel要更新.
我无法完全重新加载页面,因为这一切都显示为页面顶部的叠加层,页面后面还有其他表单字段.
请帮忙!
编辑:
当Recaptcha失败时从C#我调用这段代码:
ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "InvalidRecaptcha", "alert('Recaptcha Failed');Recaptcha.reload();alert('Recaptcha Reloaded');", true);
Run Code Online (Sandbox Code Playgroud)
两个警报语句都会触发,但Recaptcha仍然无法加载.
我是AngularJS的新手,所以这可能是一个微不足道的问题.
我面临的问题是,只要有更新面板部分更新,AngularJS绑定{{Object.Field}}就会恢复为未格式化状态.我知道更新面板正在用非格式化文本({{Object.Field}})替换DOM,但是我无法使角度重新评估由更新面板注入的HTML片段.
到目前为止我尝试过的:
我可以获得控制器内部DOM的句柄并直接更改它,但我知道这不是推荐的方法,因此我在这里问这个问题.
如何使角度重新评估HTML片段,由asp.net更新面板的部分更新替换/注入?
我在一个简单的ASP.NET概念验证应用程序中使用jQuery UI的可拖动和可放置库.此页面使用ASP.NET AJAX UpdatePanel进行部分页面更新.该页面允许用户将项目放入垃圾桶div中,该div将调用从数据库中删除记录的回发,然后重新绑定该项目为药物的列表(以及其他控件).所有这些元素(可拖动项和垃圾桶div)都在ASP.NET UpdatePanel中.
这是拖放初始化脚本:
function initDragging()
{
$(".person").draggable({helper:'clone'});
$("#trashcan").droppable({
accept: '.person',
tolerance: 'pointer',
hoverClass: 'trashcan-hover',
activeClass: 'trashcan-active',
drop: onTrashCanned
});
}
$(document).ready(function(){
initDragging();
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function()
{
initDragging();
});
});
function onTrashCanned(e,ui)
{
var id = $('input[id$=hidID]', ui.draggable).val();
if (id != undefined)
{
$('#hidTrashcanID').val(id);
__doPostBack('btnTrashcan','');
}
}
Run Code Online (Sandbox Code Playgroud)
当页面回发,部分更新UpdatePanel的内容时,我重新绑定了draggables和droppables.当我用光标抓住一个draggable时,我得到一个"htmlfile:Unspecified error".例外.我可以通过替换elem.offsetParent对我写的这个函数的调用来解决jQuery库中的这个问题:
function IESafeOffsetParent(elem)
{
try
{
return elem.offsetParent;
}
catch(e)
{
return document.body;
}
}
Run Code Online (Sandbox Code Playgroud)
我还必须避免调用elem.getBoundingClientRect(),因为它会抛出相同的错误.对于那些感兴趣的人,我只需要jQuery.fn.offset在Dimensions插件中的函数中进行这些更改.
我的问题是:
更新:
@some它不公开,但我会看到SO是否允许我将相关代码发布到这个答案中.只需创建一个ASP.NET Web应用程序(将其命名为 …
即使在试图找到这个问题的答案时,我还没有找到任何明确的解释(特别是没有讨论GridViews)如何解决我在运行带有UpdatePanel的程序时收到的以下错误:
Message: Control with ID 'lblDisplay' being registered through RegisterAsyncPostBackControl or RegisterPostBackControl must implement either INamingContainer, IPostBackDataHandler, or IPostBackEventHandler.
Run Code Online (Sandbox Code Playgroud)
UpdatePanel是:
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"></asp:ScriptManager>
<asp:UpdatePanel ID="up1" UpdateMode="Conditional" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="lblDisplay" eventname="Load" />
</Triggers>
<ContentTemplate>
<asp:HiddenField ID="hiddenZone" runat="server" />
<asp:HiddenField ID="hiddenZone2" runat="server" />
<div style='width: 150px;position:absolute; margin-left: 0;text-align:center;'>
<span id="clock" style='font-size:125%;'></span>
<asp:Label ID="lblDisplay" runat="server" Text=""></asp:Label></div>
<div style='width:150px;position:absolute;margin-left:150px;text-align:center;text-transform:capitalize;'>
<asp:Label ID="lblDisplay2" runat="server" Text="" Interval="5000" ontick="tick"></asp:Label>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</form>
Run Code Online (Sandbox Code Playgroud)
根据我的理解,我必须为lblDisplay实现INamingContainer接口,但我不太清楚如何实现这一点.我是否需要数据绑定UpdatePanel信息?为INamingContainer创建一个新对象?
我有一个最初绑定到sqldatasource控件的asp.net gridview,但是当用户按下外部按钮时,它会获取数据表而不是SQLdatasource控件的内容.因此,我必须在gridview的PageIndexChanging事件中编写代码以允许分页.我的代码如下:
Protected Sub gvEvents_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles gvEvents.PageIndexChanging
gvEvents.PageIndex = e.NewPageIndex
gvEvents.DataBind()
Run Code Online (Sandbox Code Playgroud)
这非常有效,直到我添加了一个AJAX更新面板,因此每次分页时整个页面都不会回发,并且分页停止工作.我调试它并发现它实际上正在调用PageIndexChanging事件,但什么也没发生.
我搜索了网络,发现一些人有同样的问题,但他们的解决方案对我不起作用.这个网站上有一个问题通过以下方式解决:
在PageIndexchanging事件中,将数据绑定到网格,确保再次从数据库中提取数据
我不知道这意味着什么; 如上所示,我的数据受到约束.我将"enable paging"设置为true,将EnableSortingAndPagingCallbacks设置为false.
如果有人可以帮助我,我真的很感激.我在下面的updatepanel中包含了我的标记.非常感谢!
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ibtnSearch" />
</Triggers>
<ContentTemplate>
<asp:GridView ID="gvEvents" runat="server" DataKeyNames = "intID"
AutoGenerateColumns="False" AllowPaging="True" GridLines="None" CellPadding="10"
ForeColor="#333333" PageSize="6" DataSourceID="defaultDS" >
<RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
<Columns>
<asp:TemplateField HeaderText="Date">
<ItemTemplate>
<!-- put code block inside label? To set the formatter to include year if
it's next year? -->
<asp:Label ID="Label1" runat="server"
Text = …Run Code Online (Sandbox Code Playgroud) 所以问题如下:
我有自己的用户控制权.其中包含脚本标记中的一些javascript文件
<script type="text/javascript" src="../somefile.js" ></script>
Run Code Online (Sandbox Code Playgroud)
或者直接在ascx页面上的一些javascript代码.如果我把这个控件放在aspx标记的某个地方,一切都有效.但是如果我将这个控件动态地添加到页面上的一些UpdatePanel占位符(这是我不能改变的逻辑),控件呈现自己然后我得到js错误消息,这表示放在somefile.js中的函数是未定义/为空.为什么会这样?无论如何强制js包括在这种情况下.
抱歉没有足够具体但代码量巨大,我无法提供相同错误的简化示例.
包含脚本,但不知何故未定义函数.我是js的新手,所以是否可能只包含脚本但未执行,因此函数未声明???
有趣的是,如果在某些页面上我的自定义控件是在aspx中声明的.动态添加更多实例不会造成任何问题.
updatepanel ×10
asp.net ×8
asp.net-ajax ×3
.net ×2
ajax ×2
c# ×2
javascript ×2
jquery ×2
vb.net ×2
angularjs ×1
gridview ×1
paging ×1
postback ×1
recaptcha ×1