这必须是世界上最简单的事情,但它不起作用。
我有一个外部div,我想应用一个类来使其显示样式= none,以便隐藏其中的所有内容。它实际上是一个asp:panel元素,所以我假设我可以在后面的代码中设置control.CssClass =“my-hidden-class”。
我实际上是在按钮点击处理程序上设置它(取决于某些条件)但是从不应用该类。当我在Firebug中检查div元素时,它甚至没有class属性。它看起来与.aspx标记完全一样(当我以声明方式添加它时,实际的css类很好并且应用了。)
另外,如果我在初始get请求的prerender方法中设置CssClass,我可以看到该类已应用。所以我想也许我会把所有的逻辑放在prerender中并相应地更新Css类。这也不起作用 - 该类在初始化时得到应用,但我不能随后更改它。
所以,总结一下,我似乎无法在事件处理程序中完全使用代码后面的类,我只能在prerender中将它应用于初始获取请求&这个值会在所有回发中保留。
我做错了什么?
编辑:这是代码 -
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";
}
}
更新 - 按钮点击事件来自用户控件&amp;这被连线以在更新面板上触发更新 - 即发生部分回发。我正在做这个隐藏&amp;显示包含aspx页面中的div&amp;即使所有服务器端页面事件都在执行,我猜测页面的内容没有被重新渲染,所以我没有看到我的更改。
解决方案 - 我最终从服务器上喷出了一些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");
}
答案 0 :(得分:3)
正如所怀疑的那样,问题是发生了部分回发,其中只重新呈现了更新面板的内容。
也就是说,所有服务器端页面生命周期事件仍在调用中。这让我很困惑,因为我可以调试并看到正在应用但未在html中呈现的CssClass。就像我猜的那样Asp.Net更新面板的工作方式。