渲染多个日历膨胀html,bogs down page

时间:2009-07-17 16:03:59

标签: c# asp.net html calendar

注意:我使用的是Infragistics控件,因为这是继承的遗留代码,但如果这是一个更好的解决方案,我不会重写ASP.NET控件。

我有一个Repeater控件,它使用Infragistics WebDateChooser来选择记录的日期。假设Repeater中的每个项目代表一个客户,我选择一个激活日期或那种性质的东西。它可能是过去,现在或将来的任何时间。

当你渲染这个控件20次时,它会将所有重度html写入显示所有日期(月份名称,工作日等等)20次并显着增加html。这导致浏览器在任何合理的时间内都非常难以呈现页面,即使是20个记录(在转发器上实现的分页只是为了防止浏览器在大量页面上崩溃)。对于标准的ASP.NET日历控件来说,这也是一个较小(但仍然很重要)的程度。

我正在寻找的是一种方法,可以使所有20个日期选择器共享1个日历的资源,这样他们就不需要渲染自己的字符串和垃圾来显示详细日期。

修改 我知道许多用户没有使用Infragistics,但它仍然与标准的内置ASP:Calendar控件一样。将一个放入转发器并显示n> 20次。渲染时它会使浏览器陷入困境。

此外,只是为了澄清这对任何人的潜在解决方案都很重要,这个代码库是在.NET 2.0上,并且必须支持IE6。

5 个答案:

答案 0 :(得分:2)

您可能考虑的另一件事是在页面上有一个日历实例。当用户单击“激活”日历的文本框时,您可以使用客户端javascript框架(如jquery)来显示日历并将其移动到正确的预期位置。选择日期后,将所选日期存储在正确的文本框中,然后再次隐藏日历。你将不得不写一些javascript,但它会下载所有额外的膨胀!

答案 1 :(得分:2)

如果您要查找的是在网格中的每个日期字段上调用并显示的Datepiker,则调用JavaScript日历是最有效的。查看JQuery ui日历,然后将调用放在每个字段上 - 请参阅:jqueryui.com/demos/。

HTML - 注意类是相同的,ID不同:

<input type="text" class="datepicker" id="d1" />
<input type="text" class="datepicker" id="d2" />

然后JQuery选择css类:

$(.datepicker.each(function() {
  $(this).datepicker();
});

旧的ASP.Net解决方案是为了在触发click even时声明并在服务器上动态实例化控件。许多博客都有很多例子。或者可以在页面加载时创建其中的20个并放置在数据网格或其他内容中。但是如果datagrid有100个条目怎么办?它无法扩展。

但是AJAX控件工具包中有一个日历,它在面板上创建一次,然后在您告诉它的地方显示该面板。它是一个日历,多次显示。

<asp:Panel ID="panelCal" runat="server">      
  <asp:UpdatePanel ID="update" runat="server">           
    <ContentTemplate>   
    <asp:Calendar ID="theonlyCal"runat="server"/>           
    </ContentTemplate>      
  </asp:UpdatePanel>
</asp:Panel>

现在说有20行:

<asp:TextBox ID="twenty" runat="server" /> 

现在每个文本框都需要一个弹出控件扩展器。

<ajaxToolkit:PopupControlExtenderID="twentExtenders"runat="server"
TargetControlID="twenty"
PopupControlID="panelCal" 
Position="Bottom" /> 

ASP.NET AJAX可以使用大量带宽。

答案 2 :(得分:0)

我没有使用你的控件,所以我不能说这个是否适合你,但我强烈推荐:http://www.dynarch.com/projects/calendar/这是一个javascript日历,所以用户只会下载js包含一次。之后,创建调用只是几行。

它不是立即与ASP.Net“拖放”兼容。我建议将其包装在用户控件中。

答案 3 :(得分:0)

虽然它没有统一到控件的一个实例中,但是你可以使用AjaxControlToolkit附带的CalendarExtender吗?我刚刚在我的机器上构建了一个小例子,并没有让页面陷入困境。

答案 4 :(得分:0)

好的Infragistics示例明确表明该控件是为了重用而构建的。他们当然没有使用中继器,但最终都是一样的。我将研究UltraGridColumn如何使用WebDateChooser来显示下拉列表。 当然,这对更普遍的问题没有帮助。为此,我会像其他人说的那样创建一个控件,并在需要时使用javascript将其显示在需要的地方。
如果你真的不想自己编写任何javascript,你可以利用这些工具包。您可以创建任何日历(不是下拉版本)的实例,并使用AjaxControlToolkit的modalpopup,Infragistic的WebDialogWindow或类似的东西(可能具有更少的对话框,更多浮动)来显示它。

最后,所有选项都有一个共同点。他们在转发器之外创建一个日历,并根据需要显示该日历的实例。