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();