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# 中的代码示例适用于我。非常感谢!

4

2 回答 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; }
于 2009-09-15T03:16:00.357 回答
1

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

你将把它插入一个页面,让它为你做所有的脏活。例如,基于一些逻辑的输出代码[这将花费大量时间编写],一旦你完成它。

获取该自动代码(如果每次由另一个控件实际完成,这将是沉重的负担),删除辅助控件并将新代码硬编码放置在您想要的任何位置。

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

我只是在寻找同样的东西,它突然打动了我。我将此方法用于其他事情[扫描所有控件并输出一些初始化代码],但我想您也可以使用此方法轻松地做到这一点!

刚刚写了,分享给大家

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();
    }
}
于 2010-04-12T08:12:26.123 回答