我试图从某个页面(this.Page.Controls)解析所有控件(例如ascx文件)的所有属性,以获取具有我指定的属性值的属性的名称,例如 - 具有值“this is my header”的属性的名称是什么? (它可能是包含此值的文本框)。
以下内容会返回此错误:
无法获取内容,因为内容不是文字。 System.Web.UI.HtmlControls.HtmlContainerControl.get_InnerHtml()
不确定它的意义或如何纠正它。
public function Empenhos(Request $request)
{
$query = DB::table('empenho as emp')
->select('emp.nrEmpenho as a',DB::raw("DATE_FORMAT(emp.date, '%d/%m/%Y') as b"))
->orderby('emp.nrEmpenho');
if ($request->dateini) $query->where('emp.date', '>=', $request->dateini);
if ($request->datefim) $query->where('emp.date', '>=', $request->dateini)
->where('emp.date', '<=', $request->datefim);
$table = $query->paginate($request->perPage ? $request->perPage : 20);
$header = ['Numero', 'Data', 'Tipo', 'Credor', 'Ficha', 'Fonte', 'Valor'];
return view('results.planejamento.empenhos',
['perPage' => $request->perPage, 'title' => $this->title,
'title2' => $this->title2[6], 'header' => $header, 'table' => $table, 'return' => 'Empenhos']);
}
我认为它停留在一个与要求不匹配的属性上,为什么它不会简单地移动到下一个,直到找到一个合适的?
显然,被卡住的财产是 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;
}
PS。我已经测试了送到方法的listOfControls并且它正在正确生成
稍后更新: 我正在尝试的另一种方法是:
System.String Inner.Html
但是我得到的Object引用没有设置为对象的实例。在线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;
}
答案 0 :(得分:1)
这是HtmlContainerControl.InnerHtml
的记录行为 - 在“例外”部分中,记录了它会抛出HttpException
如果:
有多个HTML服务器控件 - 或 -
HTML服务器控件不是System.Web.UI.LiteralControl或System.Web.UI.DataBoundLiteralControl。
听起来后一种情况正在你的情况下发生。该代码不会“继续”,因为抛出异常但未被捕获。
老实说,我建议您对所检查的控件类型有点挑剔,我可能会使用特定属性而不是只调用ToString()
。
答案 1 :(得分:0)
如果控件内部有控件,您将收到该错误。您是否需要搜索可能位于列表中控件内部的控件?如果是这样,您需要使用递归并继续向下钻取控件(以及其中的任何控件),并仅检查不包含其他控件的控件上的InnerHtml
。
您还可以通过仅在property.PropertyType == typeof(string)
时检查值来简化此操作。您也可以将搜索范围限制为仅有两个属性 - Text
和InnerHtml
(如果适用)。