C# 如何从LiteralControl获取href?

C# 如何从LiteralControl获取href?,c#,asp.net,linq,C#,Asp.net,Linq,我需要从LiteralControl读取href,并为其添加一些属性: 加价 <a id="aMyAnchor" runat="server" href="bob.com">click me</a> 结果如下: 无法将“System.Web.UI.LiteralControl”类型的对象强制转换为 'System.Web.UI.HtmlControls.HtmlAnchor' 将其强制转换为,然后可以使用其属性。可以将所需的目标对象强制转换为“”类型,并使用“”属性进行

我需要从
LiteralControl
读取href,并为其添加一些属性:

加价

<a id="aMyAnchor" runat="server" href="bob.com">click me</a>
结果如下:

无法将“System.Web.UI.LiteralControl”类型的对象强制转换为 'System.Web.UI.HtmlControls.HtmlAnchor'


将其强制转换为,然后可以使用其属性。

可以将所需的目标对象强制转换为“”类型,并使用“”属性进行操作。

将href分配给另一个控件的value属性,并将该控件隐藏。

var myAnchor=divLinkContainer.Controls
var myAnchor = divLinkContainer.Controls
    .Cast<Control>()
    .Where(a => a is HtmlAnchor).Select(a=>(HtmlAnchor)a)
    .Where(a => a.HRef.Contains(url))
    .First();
.Cast() 。其中(a=>a是HtmlAnchor)。选择(a=>(HtmlAnchor)a) .Where(a=>a.HRef.Contains(url)) .First();

我们的想法是将Cast与最可能/最相关的基类一起使用,并确保所有要强制转换的控件都继承该类型。

您的
divLinkContainer
节点可能包含无法强制转换为
HtmlAnchor
类型的其他节点。要仅选择
HtmlAnchor
类型的节点,请使用:

var myAnchor=divLinkContainer.Controls
第()类
.Where(a=>a.HRef.Contains(url))
.First();

我不明白您为什么不使用超链接,因为您无论如何都要在服务器端访问超链接。这样做时,我会遇到一个异常:无法将“System.Web.UI.LiteralControl”类型的对象强制转换为“System.Web.UI.HtmlControls.HtmlAnchor”。可能是因为您已经在中声明为LiteralControl。在designer.cs中将受保护的全局::System.Web.UI.LiteralContro aMyAnchor修改为受保护的全局::System.Web.UI.HtmlControls.HtmlAnchor aMyAnchor。但是实际上,如果
a
runat=server
,它就被映射到HtmlAnchor。但是,当使用LiteralControl时,我固执地问。我想要一个使用LiteralControl的解决方案@白ジェームス: 这可以做得更干净:
divLinkContainer.Controls.OfType()。首先(a=>a.HRef.Contains(url))
:pya,但我生活在一个1024x768的世界里。顺便说一下,我总是为我的锚点获取“序列不包含元素”。知道为什么吗?即使我删除了where部分@白ジェームス: 您获取的序列不包含任何元素,因为
.First()
方法要求序列不是空的。如果要在未找到元素的情况下获取
null
,请使用
.FirstOrDefault()
。空序列表示没有与您的条件匹配的元素。我明白了。我以前没有意识到这一点,但我的标记在这个问题上过于简单了@白ジェームス: 你为什么不通过它的id访问你的锚?这确实比使用LINQ更容易。但是,如果您的标记与您在问题更新中发布的标记完全相同,那么仍然可以使用LINQ来完成。如果锚定的深度确实未知,那么我看到的唯一解决方案是迭代子节点的所有子节点等。出于某种原因,我每次都会得到“sequence contains no elements”,即使我删除了.contains部分并尝试获得所有Htmlanchor。在调试器中,它们仍然显示为LiteralControl。var test=divLinkContainer.Controls.OfType();如果锚点不是divLinkContainer的直接子级,并且您首先调用,则会出现此异常。您需要找到一种方法来获取所有子代。哦,是的。每个锚都有p标签作为它的直接父对象。我在这里找到了答案:你用我提供的信息回答了我的原始问题。
string url= "bob.com";
var myAnchor = divLinkContainer.Controls
    .Cast<HtmlAnchor>()
    .Where(a => a.HRef
    .Contains(url)).First();
var myAnchor = divLinkContainer.Controls
    .Cast<Control>()
    .Where(a => a is HtmlAnchor).Select(a=>(HtmlAnchor)a)
    .Where(a => a.HRef.Contains(url))
    .First();
var myAnchor = divLinkContainer.Controls
    .OfType<HtmlAnchor>()
    .Where(a => a.HRef.Contains(url))
    .First();