0

代码 :

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 元素。

为什么?我哪里错了?

4

5 回答 5

2

难道不应该像

HiddenField hf = div.Controls.OfType<HiddenField>().LastOrDefault();
于 2012-05-08T07:19:29.220 回答
1
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;

这是一个“安全演员”......

于 2012-05-08T07:19:16.727 回答
1

我认为@Pranay Rana 是对的。如果您显式转换也失败了,我认为您需要检查您想要的元素是否是隐藏字段。此外,您的代码有一些问题。在继续之前,您应该始终进行一些验证。如果没有,也许在测试阶段,你的代码运行良好。但在生产后期可能会遇到一些错误。

于 2012-05-08T07:30:16.690 回答
0

如果你知道它是一个 HiddenField,这应该可以工作:

HiddenField hf = div.Controls.LastOrDefault() as HiddenField;
于 2012-05-08T07:19:36.773 回答
0

我认为您应该首先检查它是否是隐藏字段

if( div.Controls.OfType<HtmlGenericControl>().LastOrDefault() is HiddenField)
{
  /// rest of the processing code 
}

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

于 2012-05-08T07:21:28.410 回答