2014-01-15 84 views
3

這必須是世界上最簡單的東西,但它只是不工作。不能更改代碼背後的CssClass

我有一個外部div,我想要應用一個類來使其顯示樣式=無,以便它隱藏其中的所有內容。它實際上是一個asp:panel元素,所以我假設我可以在後面的代碼中設置control.CssClass =「my-hidden-class」。

我實際上將它設置在按鈕單擊處理程序上(取決於某些條件)但該類從未應用。當我檢查Firebug中的div元素時,它甚至沒有class屬性。它看起來就像它在.aspx標記中一樣(當我以聲明方式添加它時,實際的css類很好用&)。

此外,我可以看到該類應用,如果我在初始獲取請求的prerender方法中設置CssClass。所以我想也許我會把所有的邏輯預渲染,並相應地更新Css類。這也不起作用 - 班級在初始階段得到了應用,但我無法在隨後進行更改。

因此,總而言之,我似乎無法在事件處理程序中應用代碼背後的類,並且我只能在預渲染中將其應用於初始獲取請求&此值在所有回發中保留。

我在做什麼錯?

編輯:下面的代碼 -

ASPX:

 <asp:panel runat="server" ID="TariffContainer"><!--this is the div I want to toggle--> 
     <cms:ContentBlock ID="currentTariffsInfo" SkinID="Public/OurPrices/CurrentTariffsInfo" runat="server" /> 
     <ucTcrPanel:tcrpanel ID="tcrpanel" PagingEnabled="true" runat="server" /> 

     <div class="quick-price"> 
      <asp:LinkButton runat="server" CausesValidation="false" ID="QuickEnergyPrice" OnClientClick="Javascript:return false;" CssClass="button subcontent"><span>Get a quick energy price</span></asp:LinkButton> 
     </div> 
     <div class="not-for-sale"> 
     <cms:ContentBlock ID="preservedTariffsLinkInfo" SkinID="Public/OurPrices/PreservedTariffsLinkInfo" runat="server" />    
      <p> 
      <asp:LinkButton runat="server" CausesValidation="false" ID="ViewNotAvailableTariffs" OnClick="RedirectToUnavailableTariffs" cssclass="arrow">View tariffs not available for sale</asp:LinkButton> 
      </p> 
     </div> 
    </asp:panel> 

代碼背後:

 protected void PostCodeChange_BtnClick(object sender, EventArgs e) 
    { 
     if (IsValid) 
     { 
      tcrpanel.ApplyPostcodeUpdate(postcode.EnteredPostCode); 
      tcrpanel.TcrUpdatePanel.Update(); 
     } 
     else 
     { 
      TariffContainer.CssClass = "formContentHidden"; 
     } 
    } 

更新 - 按鈕單擊事件是由用戶控制&未來,這是有線了觸發更新面板上的更新 - 即發生部分回發。我這樣做隱藏&即使所有的服務器端頁面事件正在執行我所猜測的頁面內容沒有得到重新呈現,因此我沒有看到包含aspx頁面& div顯示我的變化。

的解決方案 - 我結束了從服務器噴出一小段JavaScript下來:

protected void PostCodeChange_BtnClick(object sender, EventArgs e) 
    { 
      tcrpanel.ApplyPostcodeUpdate(postcode.EnteredPostCode); 
      tcrpanel.TcrUpdatePanel.Update(); 
    } 

然後在後面的tcrpanel用戶控件代碼:

public void ApplyPostcodeUpdate(string postcode) 
    { 
     if (IsValid) 
     { 
      BuildStartUpScript("showTariffContainer();"); 
     } 
     else 
     { 
      BuildStartUpScript("hideTariffContainer();"); 
     } 
    } 

    private void BuildStartUpScript(string functionCall) 
    { 
     StringBuilder script = new StringBuilder(); 
     script.AppendLine("<script type=\"text/javascript\">"); 
     script.AppendLine(functionCall); 
     script.AppendLine("</script>"); 
     ScriptManager.RegisterStartupScript(pnlUpdateTcr, pnlUpdateTcr.GetType(), "HideTariffContainerScript", script.ToString(), false); 
    } 

然後在包括JS文件:

function hideTariffContainer() { 
      $("div.formContentVisible").toggleClass().toggleClass("formContentHidden"); 
    } 

    function showTariffContainer() { 
      $("div.formContentHidden").toggleClass().toggleClass("formContentVisible"); 

}

+1

你可以把相關的代碼?將有助於確定問題。 – sr28

+0

永遠不會有更改代碼中的類的問題。你在使用皮膚嗎? – afzalulh

+0

@afzalulh - 是的,使用皮膚,但它不應該在這裏有任何影響 –

回答

3

懷疑問題在於發生部分回發,其中只有更新面板的內容正在重新呈現。

也就是說,所有的服務器端頁面生命週期事件仍然被調用。這讓我感到困惑,因爲我可以調試並看到正在應用CssClass,但未在html中呈現。只是Asp.Net更新面板的工作方式,我猜。

+0

我有同樣的問題,當我刪除更新面板時,我能夠更改css類,有關如何使更新面板發生這種情況的任何更新? –

+1

我已經更新了我的OP,以顯示我如何解決這個問題 –