【问题标题】:A Tag Rendering一个标签渲染
【发布时间】:2015-05-16 12:29:53
【问题描述】:

我希望每个外部“A”链接都为 Target 设置属性,但忽略所有内部链接

例子:

<a href="http://www.somelink here" title="Some Title">Some Text</a>

变成:

<a href="http://www.somelink here" title="Some Title" target="_blank">Some Text</a>

但不要理会任何非 http 链接(mailto、~/、/../PageName.aspx 等。
我编写了一个 VB.NET(不是 c#)类,将其添加到我的 Web 项目的 APP_CODE 文件夹中,但代码被完全忽略
Public Class MyLinks Inherits HyperLink Protected Overrides Sub Render(writer As HtmlTextWriter) Dim alink As HyperLink = Me If alink.NavigateUrl.StartsWith("http") Then writer.RenderBeginTag(HtmlTextWriterTag.A) writer.AddAttribute(HtmlTextWriterAttribute.Href, alink.NavigateUrl) writer.AddAttribute(HtmlTextWriterAttribute.Title, alink.Text) writer.AddAttribute(HtmlTextWriterAttribute.Value, alink.Text) writer.AddAttribute(HtmlTextWriterAttribute.Target, "_blank") writer.RenderEndTag() End If End Sub End Class
显然,我不希望我的网站包含数千个超链接控件,但我继承了它,因为我不知道访问 href 和 tex 属性的另一种方法。
我做错了什么以及如何纠正它?

【问题讨论】:

    标签: asp.net vb.net hyperlink


    【解决方案1】:

    使用 jQuery 更容易做到,只需添加以下内容:

    $(document).on('click', "a[href^='http']:not([href*='" + window.location.host + "'][target='_blank']),a[href^='//']:not([href*='" + window.location.host + "'][target='_blank']),a[href$='.pdf'],a[href$='.xls'],a[href$='.xlsx'],a[href$='.doc'],a[href$='.docx'],a[href$='.ppt'],a[href$='.pptx']", null, function () {
    $(this).attr('target', '_blank');
    });
    

    【讨论】:

    • 对这种方法不感兴趣,因为我说的是 5000 多个链接,所以我希望它通过后面的代码完成,因为它会进入 DLL
    • 如果您坚持在代码后面执行此操作(我认为这是一个坏主意),那么您需要更改所有链接以使用新控件(MyLinks)。另外,与其扔掉超链接的整个渲染,不如直接改变目标属性,让基类正常渲染?
    • 有一种方法可以强制所有超链接控件改为使用您的控件,但我不记得确切的方法,只是在 web.config 中进行了更改。我上面给你的代码效果很好。只需将它放在您的站点范围的 javascript 文件中(我们的站点是 site.js),它就可以在一个拥有超过一百万个链接的站点上运行。
    • 感谢您的回复。 Microsoft 做了一篇关于呈现超链接控件的文章,但我使用的是 html a 链接。我看到互联网上的其他人实际上确实提出了类似的问题。我认为 Yet Another Forum (YAF) 也是这样做的,并且已经下载了 Github 源代码(C# 中),并会看看他们是如何做到的。我知道他们使用 ViewState 元素来保存布尔值(在新窗口中打开所有链接 = True|False),但我只需将其设置为 true 并检查 StartsWith("http") 然后执行它。同样,YAF 也在 DLL 中执行此操作,您认为这是一个坏主意。
    【解决方案2】:

    我在后面的代码中覆盖了 Render 方法。 http://forums.asp.net/t/509737.aspx?override+the+href+tag+of+a+LinkButton。这个页面上 NewWindow 的代码给了我这个想法。

    【讨论】:

      猜你喜欢
      • 2015-01-22
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 2016-10-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多