无法动态更改SkinID属性

时间:2011-01-12 21:55:02

标签: c# asp.net skin

当我尝试让我的C#类更改asp控件的外观时,我收到此错误:

  

'SkinId'属性只能在Page_PreInit中或之前设置   静态控件的事件。对于动态控件,请先设置属性   将它添加到Controls集合中。

我的目标是在每个页面上提供一个面板,称之为ID =“response”,然后动态地将其CSS类从Error更改为Success,或者将Success更改为Error(因此它为红色或绿色)。而且,当创建响应时,我将其设为visible = true。

显然,我被迫使用CssClass属性,这是唯一可行的方法。

作为一个偏离主题的说明:  在PHP中,您不会遇到使用不同的“pre-init”“post-init”等问题。这是一个完全不必要的过程。您只需在将html发送回用户之前更改html即可。我有点困惑为什么ASP.NET决定使一切都复杂化。我花时间学习所有这些不同的复杂过程来简单地显示一个网页,这有点愚蠢。学习在微软上难以阅读的ASP生命周期文档中编写的所有怪癖需要时间。不要侮辱任何微软的人,但这是不切实际的。

3 个答案:

答案 0 :(得分:3)

如果它是一个静态控件,就是你在.aspx页面中定义了Panel,那么改变SkinId的唯一地方是PreInit方法,例如:

protected override void OnPreInit(EventArgs e)
{
    base.OnPreInit(e);
    String panelSkin = ViewState("panelSkin").toString();
    panel1.SkinId = panelSkin;
}

当然,PreInit方法仅在首次初始化页面时调用 - 而不是在PostBack上。

您可以将想要使用的skinId保存到ViewState,然后调用Response.Redirect(“myPage.aspx”)...并且如上所示从ViewState中获取skinId字符串并相应地设置Panel skinId。

或者,不要使用Panel尝试使用.Net Ajax库中的UpdatePanel。单击UpdatePanel中的按钮(如果它设置为触发ASyncPostBack)将运行OnPreInit方法。

也就是说,如果您要更改背景,那么使用CssClass属性将是最有效的方法。

答案 1 :(得分:1)

ASP及其子ASP.NET基本上是一个巨大的黑客HTML和IIS页面渲染器。它挂钩到IIS中已经存在的生命周期的各个阶段,而不是像PHP那样拥有自己的生命周期。因此,你可以在某些领域做一些事情,因为它所依赖的东西要么不是一成不变的,所以你可以改变它们,或者你可以使用它们。 ASP.NET的强大功能,它与.NET类和.NET Framework的互操作,IMO弥补了它的一些特性。

无论如何,Skins是主题的一部分,它们在过程的早期加载,因此可以使用正确的默认样式初始化控件。这是关键;主题在PreInit之后被锁定,但Skins背后的样式(和CssClasses)可以编辑,包括PreRender,其中包括事件处理程序(触发验证)。因此,动态设置Style或CssClass。

要在没有完整回发的情况下执行此操作,您可以将应该更改颜色的控件放在AJAX UpdatePanel中,该控件可以与页面的其他元素分开重新呈现,并将保留其当前内容,直到修改DOM为止通过JavaScript客户端。

答案 2 :(得分:1)

设置CssClass属性更接近你用PHP做的事情,那么为什么不这样做呢?

Skin文件的两个真正好处是为所有控件设置默认值(根本没有skinId)或设置无法用css控制的属性。