【问题标题】:Changing a control's style based on validation (ASP.NET)根据验证更改控件的样式 (ASP.NET)
【发布时间】:2010-11-27 03:59:27
【问题描述】:

我有一个非常简单的表格,带有以下麻烦的sn-p:

<asp:Panel class="normal" ID="Panel1" runat="server">
 <strong><asp:Label ID="Panel1Error" class="error" Visible="false" runat="server"/></strong>

 <label for="TextBox1"><em>*</em> Don't leave this blank</label>
 <asp:TextBox ID="TextBox1" runat="server" />

 <asp:RequiredFieldValidator ID="TextBox1RFV" runat="server"
  ControlToValidate="TextBox1" ErrorMessage="This field cannot be blank."
  Display="None" />

    <--- other validators --->
</asp:Panel>

当页面验证失败时,我想做两件事:

  1. 更改 Panel1 的样式(更改为显示不同颜色以指示错误的样式)。我可以通过在 Page_Load 中调用 Page.Validate 来做到这一点,然后遍历 Page.Validators,获取每个验证器的父控件,将其转换为 Panel,然后设置 .CssClass 似乎不是一个极好的解决方案,但它得到了工作完成 - 有没有更好的方法?

  2. 我想将抛出的任何验证错误放入 Panel1Error 标签中,并将其设置为可见。这是我有点困惑的地方。起初我以为我可以指定验证器写入错误消息的标签,但我没有这样的运气。如果我只是将验证器扔到标签内,它的格式会弄乱页面的整个布局,无论我是直接为其分配“错误”CSS 类还是将其留在标签中。

澄清一下,在生产中,我会为一个页面上的多个面板执行此过程,每个面板都有一个表单元素,从而阻止我显式调用面板并只说 Panel1.CssClass 等。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:
    1. 我会推荐一个 javascript 解决方案。 ASP.NET 注入了一个名为 Page_Validators 的全局 js 变量,它是页面上所有验证器跨度的数组。我在my blog 上写过这个。这是一个不同的解决方案,但它应该能让您有足够的洞察力来开始使用。
    2. 为每个面板使用ValidationSummary 控件和ValidationGroup

    【讨论】:

    • @ #2,再次尝试澄清:有多个面板,每个面板都包含一个表单元素,每个面板都有自己的验证器。据我了解,ValidationSummary 总结了整个页面上的所有验证 - 我想要的是逐个面板(或从美学上讲,逐个部分)报告错误。例如,如果您不输入您的姓名,我想在页面顶部(在 ValidationSummary 中)以及特定于该元素的标签中实际表单元素的正上方显示错误。跨度>
    【解决方案2】:
    1. 如果有效的话,看起来还不错。

    2. 使用ValidationSummary 控件。或者您可以从控件继承并覆盖渲染事件。

    【讨论】:

    • 对于#2,我实际上已经在页面顶部使用 ValidationSummary 来收集每个面板的所有错误。我没想过覆盖渲染事件,我会研究一下它是如何完成的,看看它是否有效。
    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多