2

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

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

我的目标是在每个页面上提供一个面板,将其称为 ID="response",然后动态地将其 CSS 类从错误更改为成功,或将成功更改为错误(因此它是红色或绿色)。当创建响应时,我也让它可见 = true。

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

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

4

3 回答 3

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 字符串并相应地设置面板 skinId。

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

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

于 2011-01-12T22:37:57.797 回答
1

设置 CssClass 属性更接近于您对 PHP 所做的事情,那么为什么不直接这样做呢?

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

于 2011-01-12T22:37:24.643 回答
1

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

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

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

于 2011-01-12T22:26:29.433 回答