Code :
foreach (HtmlGenericControl div in panelCategorieGuida.Controls.OfType<HtmlGenericControl>())
{
HiddenField hf = div.Controls.OfType<HtmlGenericControl>().LastOrDefault();
}
它说"我不能隐式地将HtmlGenericControl转换为HiddenField"。另外,如果我写(HiddenField)div.Controls.OfType<HtmlGenericControl>().LastOrDefault()
div 的最后一个元素(它是一个 HtmlGenericControl)始终是一个 HiddenField 元素。
为什么?我错在哪里?
不应该像
HiddenField hf = div.Controls.OfType<HiddenField>().LastOrDefault();
foreach (var div in panelCategorieGuida.Controls.OfType<HtmlGenericControl>())
{
var hf = div.Controls.OfType<HiddenField>().LastOrDefault();
}
您的初始代码仅执行以下操作:
- 将列表筛选为元素,这些元素是
HtmlGenericControl
类型 - 取最后一个(或默认值)
- 将其强制转换为
HiddenField
(隐式和/或显式)
现在:除非最后一个元素(类型为 HtmlGenericControl
)不是真正的HiddenField
否则您将获得无效的强制转换异常。您可以过滤要HiddenField
的元素(就像我所做的那样),或者更确切地说,采用以下代码:
var hf = div.Controls.OfType<HtmlGenericControl>().LastOrDefault() as HiddenField;
这是一个"安全演员"...
我认为@Pranay拉纳是对的。如果你的显式强制转换也失败了,我认为你需要检查你想要的元素是否是隐藏字段。此外,您的代码也存在一些问题。在继续之前,您应该始终进行一些验证。如果没有,也许在测试阶段,您的代码运行良好。但它可能会在以后的生产中遇到一些错误。
如果你知道这是一个隐藏字段,这应该可以工作:
HiddenField hf = div.Controls.LastOrDefault() as HiddenField;
我认为您应该首先检查它是否是这样的隐藏字段
if( div.Controls.OfType<HtmlGenericControl>().LastOrDefault() is HiddenField)
{
/// rest of the processing code
}
这可能会解决您的问题,因为您获得的元素可能不是隐藏字段元素