这些 .NET 控件有什么问题



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 
}

这可能会解决您的问题,因为您获得的元素可能不是隐藏字段元素

最新更新