c# - 修改现有元标记

标签 c# asp.net

我有这段代码可以删除我无法访问的现有元标记,因为它在它附带的解决方案 dll 中,但基本上,我想删除它随附于我们公司内容的元标记内容。问题是它没有找到元标记,我认为是因为我设置 htmlHead = Page.Header; 的方式。我想我在那里遗漏了一些东西..但不确定..这段代码在基类的虚拟 Page_Load 中。

    HtmlHead pHtml = Page.Header;

    for (int i = pHtml.Controls.Count - 1; i >= 0; i--)
    {
        if (pHtml.Controls[i] is HtmlMeta)
        {
            pMeta thisMetaTag = (HtmlMeta)pHtml.Controls[i];

            if (thisMetaTag.Name == mName)
            {
                pHtml.Controls.RemoveAt(i);
            }
        }
    }

我不确定我是否对 header 进行了正确的重定向,因为这是在基类中的虚拟 Page_Load 中。此外,大部分代码取自 (99%) 来自此处 Code for meta tag removal and replacement

任何帮助将不胜感激

最佳答案

这可能是事件发生顺序的问题。我在 ASP.NET 中创建了一个新页面

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="FormMail.WebForm1" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 <html xmlns="http://www.w3.org/1999/xhtml" >
 <head runat="server">
     <title>Untitled Page</title>
     <meta http-equiv="keyword" name="testy" content="default content" />
 </head>
 <body>
     <form id="form1" runat="server">
     <div>

     </div>
     </form>
 </body>
 </html>

然后我使用了:

    protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {
            string mName = "testy";

            HtmlHead pHtml = Page.Header;

            foreach (HtmlMeta metaTag in pHtml.Controls.OfType<HtmlMeta>())
            {
                if (metaTag.Name.Equals(mName, StringComparison.CurrentCultureIgnoreCase))
                {
                    metaTag.Content = "Yeah!";
                    break; //You could keep looping to find other controls with the same name, but I'm exiting the loop
                }
            }


            //for (int i = pHtml.Controls.Count - 1; i >= 0; i--)
            //{
            //    if (pHtml.Controls[i] is HtmlMeta)
            //    {
            //        HtmlMeta thisMetaTag = (HtmlMeta)pHtml.Controls[i];
            //        if (thisMetaTag.Name == mName)
            //        {
            //            thisMetaTag.Content = "Yeah!";
            //           // pHtml.Controls.RemoveAt(i);
            //        }
            //    }
            //} 

        }

    }

当我查看源代码时,我看到元标记的内容被修改了。现在,您的问题可能是在循环时,控件不存在(尚未添加)并且您正在添加它,然后内置代码正在添加它。

编辑 - 建议将代码移动到 PreRender,以防在加载之后但在呈现之前添加控件

    protected override void OnPreRender(EventArgs e)
    {
        if (!IsPostBack)
        {
            string mName = "testy";

            HtmlHead pHtml = Page.Header;

            foreach (HtmlMeta metaTag in pHtml.Controls.OfType<HtmlMeta>())
            {
                if (metaTag.Name.Equals(mName, StringComparison.CurrentCultureIgnoreCase))
                {
                    metaTag.Content = "Yeah!";
                    break;
                }
            }
        }
        base.OnPreRender(e);
    }

关于c# - 修改现有元标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8435950/

相关文章:

c# - 带有 IFormattable 参数的函数不接受字符串

c# - MEF 对象生命周期

c# - 响应重定向不适用于本地主机

javascript - 使用 Javascript 存储 session 显示在 ASP.NET C# 中另一个页面的标签中

javascript - 翻转在 asp.net 中的 IE 和 Firefox 中不起作用

c# - 如果我之后直接使用 `Response.Flush()` ,那么 `Response.End()` 有意义吗?

c# - 如何在 F# 或 C# 中将像素绘制到位图上而不是抗锯齿点上?

c# - 关于 IoC/DI VS CBSE 的信息

c# - 将绑定(bind)的组合框添加到数据 GridView

c# - 部分 View 和 html 表单 Asp Mvc