如何防止asp.net中Title标签的换行?

时间:2015-05-22 04:48:50

标签: asp.net meta-tags line-breaks page-title

我使用page titlecode behind分配C#。一切正常!但是,问题就在于Title Text is displayed with LINE BREAK

那么,如何prevent the Line Break Title

phonesOnly.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage_New.master" AutoEventWireup="true" CodeFile="phonesOnly.aspx.cs" Inherits="phonesOnly" %>

phonesOnly.aspx.cs

protected void SetTitle()
{
 this.Page.Title = "Sell Your Cell Phone Online or at our Los Angeles locations";
}

查看页面来源:

<title>
    Sell Your Cell Phone Online or at our Los Angeles locations 
</title>

没有换行的预期渲染:

<title>Sell Your Cell Phone Online or at our Los Angeles locations</title>

注意: 我知道我可以使用<title id="mytitle" runat='server'></title>完成但我受限制以使用runat=server。可能是由于 SEO 的观点。

请建议任何其他解决方案?

2 个答案:

答案 0 :(得分:1)

不幸的是,只要你添加一个runat =&#34;服务器&#34;到<head>标签,这就是发生的事情。 HtmlHead类在head标签内部解析你的内容,然后重写它,不幸的是,当它这样做时会把它搞砸。获得正确格式化输出的唯一方法是避免使用服务器端头标记,这意味着您不能使用Page.Title属性,因此您必须使用自己的标题变量,但是您可以通过为其分配null来删除id。在后面的代码中的id。

以下按预期方式工作:

<head> <!-- note no runas="server" -->
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title runat="server" id="myTitle"></title>
...
</head>

然后在代码背后:

myTitle.InnerText = "My Page Title";
myTitle.ID = null;

这将生成以下HTML。

<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>My Page Title</title>
  ...
</head>

这样做的好处是它不会将所有元标记聚集在一行上。

如果你正在使用母版页面,那么你必须做一些小箍跳来取代母版页的控件。在Master页面上创建一个属性以返回控件,或者像这样使用FindControl:

var ctl = Master.FindControl("myTitle") as HtmlGenericControl;
ctl.InnerText = "My Page Title";
ctl.ID = null;

确保您没有在母版页中将ID设置为null,或者FindControl在内容页面中无法工作。

答案 1 :(得分:1)

我的团队遇到了同样的问题。我们通过包装原始的HtmlTitle对象并剥离换行符来修复它。

包装类:

/// <summary>
/// Exists to remove the newlines created by asp.net
/// </summary>
public class TrimmedHtmlTitle : HtmlTitle
{
    private readonly HtmlTitle _title;
    public TrimmedHtmlTitle(HtmlTitle title)
    {
        _title = title;
    }

    protected override void Render(HtmlTextWriter output)
    {
        if (_title == null)
        {
            return;
        }

        try
        {
            using (var stringWriter = new System.IO.StringWriter())
            {
                using (var htmlTextWriter = new HtmlTextWriter(stringWriter))
                {
                    _title.Text = Text;
                    _title.RenderControl(htmlTextWriter);
                    var content = stringWriter.ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "").Trim();
                    output.Write(content);
                }
            }
        }
        catch { }
    }
}

设置和用例:

        var head = page.Controls.OfType<HtmlHead>;
        if (head != null)
        {
            var htmlTitle = head.Controls.OfType<HtmlTitle>().FirstOrDefault();
            if (htmlTitle != null)
            {
                var index = head.Controls.IndexOf(htmlTitle);
                head.Controls.Remove(htmlTitle);
                head.Controls.AddAt(index, new TrimmedHtmlTitle(htmlTitle));
                head.Title = "MyTitle";
            }
        }