在 C# 中根据条件列出所有 属性 个控件名称

list all property names of controls based on condition in C#

我正在尝试从某个页面 (this.Page.Controls) 解析我所有控件(例如 ascx 文件)的所有属性,以便获得 属性 的名称例如,我指定的 属性 值 - 值为 "this is my header" 的 属性 的名称是什么? (它很可能是包含此值的文本框)。

下面returns这个错误:

Cannot get inner content of because the contents are not literal. System.Web.UI.HtmlControls.HtmlContainerControl.get_InnerHtml()

不确定它的含义或如何更正它。

 public String searchMethod(List<Control> listOfControls, String searchedValue)
        {
            String result = "";

            foreach (var control in listOfControls)
            {
                PropertyInfo[] properties = control.GetType().GetProperties();
                foreach (PropertyInfo property in properties)
                {
                    if (property.PropertyType == typeof (string)) //added condition on this line *******************************
                    {
                        if (property.GetValue(control, null) != null)
                            if (property.GetValue(control, null).ToString().Contains("searched String"))
                            {
                                result = result + property.Name + "/" + property.GetValue(control, null) + "/";
                            }
                    }

                }
            }
            return result;
        }

我想它卡在了一个不符合要求的 属性 上,那么为什么它不直接移动到下一个直到找到一个合适的? 显然,卡住的 属性 是 System.String Inner.Html

PS。我已经测试了提供给该方法的 listOfControls,它正在正确生成

稍后更新: 我正在尝试的另一种方法是:

public string Method1(List<Control> controlList, string propName)
        {
            string result = "";
            foreach (var control in controlList)
            {
                foreach(var prop in control.GetType().GetProperties())
                {
                    if(prop.PropertyType == typeof(string))
                    {
                        if((prop.GetValue(control,null).GetType()) == typeof(string))
                            if (prop.GetValue(control, null).ToString().Contains(propName))
                        result += prop.Name + "######";
                    }
                }
            }
            return result;
        }

但是有了这个我得到了未设置到对象实例的对象引用。在线 if((prop.GetValue(control,null).GetType()) == typeof(string))

这是 HtmlContainerControl.InnerHtml 的记录行为 - 在 "exceptions" 部分,记录在案如果:

它将抛出 HttpException

There is more than one HTML server control.
- or -
The HTML server control is not a System.Web.UI.LiteralControl or a System.Web.UI.DataBoundLiteralControl.

您的情况听起来像是后一种情况。代码没有 "move on" 因为异常被抛出但没有被捕获。

老实说,我建议您对检查的控件类型更加挑剔,我可能会使用特定的属性而不是仅仅调用 ToString().

如果控件中有控件,您将收到该错误。您是否需要搜索可能在列表中的控件内部的控件?如果是这样,您需要使用递归并继续向下钻取控件(以及其中的任何控件)并且只检查 InnerHtml 不包含其他控件的控件。

您还可以稍微简化一下,只检查 property.PropertyType == typeof(string) 时的值。您还可以将搜索限制为仅两个属性 - TextInnerHtml(如果适用)。