2

我最近向单个网页添加了一个 UpdatePanel,它在按钮单击时呈现不同的用户控件。我正在努力解决一个问题,我正在使用 Header.Stylesheet.CreateStyleRule 动态地将内联样式添加到标题中 - 问题是它没有插入到部分回发中并且它确实有意义。这显然是因为它是部分回发,并且仅在页面第一次加载时才呈现标头。

样式是通过以下方法添加的,这些方法从数据库中获取样式:

Private Sub InitializeStylesheet(ByVal ButtonId As Integer)
    Dim CSSStylesheet As Stylesheet = StyleBackend.GetStylesheets(ButtonId)
    Dim IdClassList As List(Of StyleIDClass) = StyleBackend.GetStylesheetsStyleIDClass(CSSStylesheet.StylesheetID)
    'Iterates through the cssidclass
    For Each cssidClass In IdClassList
        Dim styleItems As List(Of StyleItem) = StyleBackend.GetStyleItemsByIDorClass(cssidClass.StyleIDClassID)
        Dim cssString As String = Nothing
        For Each StyleItem As StyleItem In styleItems
            cssString += StyleItem.Property & ":" & StyleItem.Value & ";"
        Next
        'Iterates all cssitems which belongs to a cssidclass
        Me.Header.StyleSheet.CreateStyleRule(New CustomStyle(cssString), Nothing, cssidClass.ClassOrID)
        Me.Header.ViewStateMode = UI.ViewStateMode.Disabled
    Next
End Sub

我一直在搜索我的屁股试图让它工作,但这似乎是不可能的。

这篇 msdn 文章字面意思是说,做我想做的事是不可能的。 http://msdn.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmlhead.stylesheet.aspx

不支持在异步回发期间以编程方式添加样式或样式规则。当您将 AJAX 功能添加到 ASP.NET 网页时,异步回发会更新页面的区域而不更新整个页面。有关详细信息,请参阅 Microsoft Ajax 概述。

有没有人有这样做的建议或替代方法?

谢谢!

4

1 回答 1

0

一种解决方案是将样式包含在主样式表中,而不是动态修改它们。即使它们是数据驱动的,如果总列表不是太大,您也可以通过 HTTP 处理程序将它们与主页一起输出。

或者(并且可能更有效),您可以将样式数据作为字符串返回给客户端并在那里进行处理。

您可以在客户端脚本管理器上侦听 EndRequest 事件:

function endRequest(){
    // look at the updated DOM     
}

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest);

也许是以下顺序:

  • 启动异步回发
  • 将样式渲染到内部的隐藏字段UpdatePanel
  • 在 上endRequest,检查 DOM 以查看它是否包含带有样式的隐藏字段(基于命名约定、数据属性或仅 ID)
  • 从隐藏字段中获取值并使用 JavaScript将它们添加到页面的样式规则中
于 2012-12-17T15:58:58.340 回答