部分回发的Header.Stylesheet.CreateStyleRule

时间:2012-12-17 15:50:24

标签: asp.net ajax vb.net asynchronous-postback

我最近在一个网页上添加了一个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概述。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

可能是以下顺序:

  • 启动异步回发
  • 将样式渲染到UpdatePanel
  • 中的隐藏字段
  • endRequest上,检查DOM以查看它是否包含带样式的隐藏字段(基于命名约定,数据属性或ID)
  • 使用JavaScript
  • 从隐藏字段中取出值add them to the page's style rules