在asp.net中全局设置每个控件的ValidationGroup属性的最佳方法是什么?

3
我有一个用户控件,其中包含表单项,在整个大型Web应用程序中被广泛重用。到目前为止,在无效的表单提交时,由使用该用户控件的.aspx 处理验证总结。
现在我需要为每个表单项控件(文本框,列表,验证器等)在运行时设置ValidationGroup属性。与其手动设置每个控件,我想要迭代用户控件中的所有控件,检测该控件是否具有ValidationGroup属性,并以此方式设置其值。
类似于以下内容:
For Each ctrl As System.Web.UI.Control In Me.Controls
   ' so now what is the proper way to detect if this control has the ValidationGroup property
Next

请提供适用于我使用的VB.NET或C#的代码示例。非常感谢!


我真的在寻找一种方法来循环遍历所有控件,并确定哪些控件包含ValidationGroup属性。经过进一步研究,似乎Type.GetField()可以让我检测到哪些控件具有ValidationGroup属性,但然后您需要向下转换为适当的类型,设置属性等。我想这是那些实现动态方法所需的总工作量超过更直接/手动方法的时候之一。我大约有35个控件,只是按照Rick的建议类似地设置它们。 - Steve Flook
2个回答

1
你的UserControl应该公开一个属性,以便在其内部正确设置ValidationGroup属性。

在.ASPX中的控件标记:

<ctl:yourcontrol id="whatever" runat="server" YourValidationGroupProp="HappyValidationName" />

控制代码后端 .ASCX:

 protected override void OnPreRender(EventArgs e)
 {
     someControl.ValidationGroup = YourValidationGroupProp;
     someControl1.ValidationGroup = YourValidationGroupProp;
     someControl2.ValidationGroup = YourValidationGroupProp;
     //......etc
 }    

 public string YourValidationGroupProp{ get; set; }

Rick,这个用户控件大约有15个不同的表单项,以及约10个不同的验证控件(约25个具有ValidationGroup属性的控件)。我希望遍历UC内的控件集合,检测它是否具有ValidationGroup属性,并在那里设置它。我知道可以像你建议的那样覆盖每个控件,但我正在寻找一种一次性完成它的方法。你有什么想法吗? - Steve Flook
如果这确实是一个重复使用的控件,你只需要像我所说的那样在代码后台实现那些表单元素的设置器一次即可。 - rick schott

1

创建一个自定义控件,继承例如literal。这个控件将是一个助手。

您将在页面中插入它,让它为您完成所有繁琐的工作。 例如,基于某些逻辑输出代码[编写这些代码需要很长时间],一旦完成,您就可以得到自动代码。

获取自动代码(另一个控件每次执行都会很耗费资源),删除助手控件并在任何需要的地方硬编码新代码。

通过让计算机找出您想要的代码,您可以避免所有错误,并获得所有硬编码速度,这将通过通用方法解决问题而受到影响。

我只是在寻找同样的东西,突然想到了这个方法。 我使用此方法处理其他事情[扫描所有控件并输出一些初始化代码],但我想您也可以轻松地使用此方法来完成此操作!

我刚刚写了它,现在与您分享。

public class ValidationCodeProducerHelper : Literal
{
    // you can set this in the aspx/ascx as a control property
    public string MyValidationGroup { get; set; }

    // get last minute controls
    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        // start scanning from page subcontrols
        ControlCollection _collection = Page.Controls;
        Text = GetCode(_collection).Replace("\r\n", "<br/>");
    }

    private string GetCode(Control _control)
    {
        // building helper
        StringBuilder _output = new StringBuilder();

        // the logic of scanning
        if (_control.GetType().GetProperty("ValidationGroup") != null && !string.IsNullOrEmpty(_control.ID))
        {
            // the desired code
            _output.AppendFormat("{0}.{1} = {2};", _control.ID, "ValidationGroup", MyValidationGroup);
            _output.AppendLine();
        }

        // recursive search within children
        _output.Append(GetCode(_control.Controls));

        // outputting
        return _output.ToString();
    }

    private string GetCode(ControlCollection _collection)
    {
        // building helper
        StringBuilder _output = new StringBuilder();
        foreach (Control _control in _collection)
        {
            // get code for each child
            _output.Append(GetCode(_control));
        }
        // outputting
        return _output.ToString();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接