2012-02-28 4 views
3

Мне нужно прочитать href с LiteralControl и добавить к нему следующие атрибуты:Как получить href из LiteralControl?

Markup;

<a id="aMyAnchor" runat="server" href="bob.com">click me</a> 

Вот что я пробовал:

string url= "bob.com"; 
var myAnchor = divLinkContainer.Controls 
    .Cast<LiteralControl>() 
    .Where(a => a.Attributes["href"] 
    .Contains(url)).First(); 

Однако LiteralControl не имеют атрибутов собственности ...

Примечание: Я знаю, что я могу получить доступ к ссылке непосредственно через свой идентификатор, но это только потому, что я сделал простой пример кода.

EDIT:

Это:

string url= "bob.com"; 
var myAnchor = divLinkContainer.Controls 
    .Cast<HtmlAnchor>() 
    .Where(a => a.HRef 
    .Contains(url)).First(); 

результаты в этом:

Невозможно привести объект типа 'System.Web.UI.LiteralControl' к типу 'System.Web.UI.HtmlControls.HtmlAnchor.

+1

я не АКС, почему вы не используете Гиперссылки вместо этого, потому что вы к нему доступ на ServerSide в любом случае. –

ответ

3
var myAnchor = divLinkContainer.Controls 
    .Cast<Control>() 
    .Where(a => a is HtmlAnchor).Select(a=>(HtmlAnchor)a) 
    .Where(a => a.HRef.Contains(url)) 
    .First(); 

Идея заключается в том, чтобы использовать Cast с максимально возможной/соответствующего базового класса, а также убедитесь, что все элементы управления, которые собираются быть литыми наследуют этот тип.

+1

Отлично. Имеет смысл. –

+0

Почему-то я получаю «последовательность не содержит элементов» каждый раз, даже если я удаляю часть .contains, и я пытаюсь получить все HtmlAnchors. В отладчике они все еще отображаются как LiteralControl. var test = divLinkContainer.Controls .OfType (); –

+0

Если якоря не являются прямыми дочерними элементами divLinkContainer, и вы вызываете First, тогда вы получаете это исключение. Вам нужно будет найти метод для получения всех потомков. –

1

Cast его в HtmlAnchor вместо этого, то вы можете использовать это свойство href.

+0

Я получаю исключение, когда я это делаю: невозможно лить объект типа «System.Web.UI.LiteralControl» для ввода «System.Web.UI.HtmlControls.HtmlAnchor». –

+0

Возможно, потому, что вы уже объявили как LiteralControl. Измените 'protected global :: System.Web.UI.LiteralContro aMyAnchor'' protected global :: System.Web.UI.HtmlControls.HtmlAnchor aMyAnchor' в файле designer.cs. Но на самом деле 'a' сопоставляется с HtmlAnchor, если это' runat = server'. –

+0

Ну да, конечно. Тем не менее, я упрямо спросил, используя LiteralControl. Я хотел бы использовать решение с помощью LiteralControl. –

0

Назначьте href для свойства value другого элемента управления и скройте его.

4

Ваш divLinkContainer узел может содержать другие узлы, которые не могут быть отлиты до HtmlAnchor. Для того, чтобы выбрать только узлы типа HtmlAnchor использования Enumerable.OfType:

var myAnchor = divLinkContainer.Controls 
    .OfType<HtmlAnchor>() 
    .Where(a => a.HRef.Contains(url)) 
    .First(); 
+1

+1 много чище. –

+0

@ 白 ジ ェ ー ム ス: это может быть сделано еще более чище: 'divLinkContainer.Controls.OfType (). Первый (a => a.HRef.Contains (url))': p – Alex

+0

ya, но я живу в мире 1024x768 , Кстати, я всегда получаю «последовательность не содержит элементов» для myAnchor. Любая идея почему? Даже если я удалю часть. –

Смежные вопросы