2010-04-29 28 views
5

Tôi đang cố gắng tối ưu hóa khả năng đọc SEO trên trang web của chúng tôi và một vấn đề mà tôi đã gặp phải là ASP.NET đang rà soát phần tử tiêu đề của MasterPage của tôi. Được nhập như vậy trong MasterPage của tôi (bằng tay dạng lại để loại bỏ ngắt dòng do <% %> tags):ASP.NET Line Breaks trong Title Element

<title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /> - <%=WebsiteSettings.WebsiteName %></title> 

Đây là sản phẩm tôi nhận được:

<title> 
    Home 
- Website Name</title> 

Như bạn thấy ASP.NET sẽ bổ sung các ngắt dòng trước và sau, trong đó <asp:ContentPlaceHolder /> thay thế bởi các định dạng tự động của Visual Studio <asp:Content /> để bắt đầu và kết thúc bằng ngắt dòng. Rõ ràng, điều này có thể được ngăn chặn trong các tùy chọn định dạng Visual Studio, nhưng điều này không lý tưởng vì tôi chỉ muốn loại bỏ hành vi đó cho phần giữ chỗ TitleContent chứ không phải phần còn lại.

Có cách nào tôi có thể đảm bảo Tiêu đề của mình được cắt trước khi nó được hiển thị không? Tôi đang sử dụng MVC để code-behind không phải là một lựa chọn chấp nhận được.

+3

Có thực sự quan trọng không? Khoảng trắng không quan trọng trong HTML và tôi nghi ngờ bất kỳ trình phân tích cú pháp công cụ tìm kiếm nghiêm túc nào cũng sẽ tìm thấy vấn đề. –

Trả lời

2

sau đây nên cho phép bạn kee p sao chép và dán mã.

Lựa chọn 1

Kể từ khi bạn sử dụng MVC tạo Helper HTML Như thế này:

namespace [ProjectName].Web.Views 
{ 
    public static class HtmlHelpers   
    { 
      public static MvcHtmlString GetFullPageTitle(this HtmlHelper helper, string PageTitle) 
      { 
       return MvcHtmlString.Create(PageTitle + " - " + WebsiteSettings.WebsiteName) 
      } 
    } 
} 

Bây giờ trong Master Page của bạn chỉ cần đặt này

<title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title> 

Sau đó, trong các trang của bạn sử dụng này

<asp:Content ID="PageTitleContent" ContentPlaceHolderID="TitleConent" runat="server"> 
    <%=Html.GetFullPageTitle("Some PageTitle")%> 
</asp:Content> 

Lựa chọn 2

Lưu ý: nếu bạn cư Dữ liệu trong hành động của bạn sau đó bạn không phải Thêm phần này vào trang bao giờ hết.

Giống như vậy:

public ActionResult myAction() 
{ 
    ViewData["Title"] = "MyActionTitle"; 
    return View() 
} 

Sau đó, trong trang chính của bạn, bạn chỉ cần làm như sau

<title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /><%= ViewData["Title"] + "-" + WebsiteSettings.WebsiteName %></asp:ContentPlaceHolder></title> 

Những điều tốt đẹp về việc này là nếu bạn muốn bạn có thể ghi đè lên những gì tiêu đề nói trong mỗi trang bằng cách thực hiện điều này

<asp:Content ID="PageTitleContent" ContentPlaceHolderID="TitleConent" runat="server"> 
     My Override Title 
    </asp:Content> 
+0

Tôi thích giải pháp này, mặc dù tôi không thể áp dụng nó trong cách tiếp cận từ trên xuống mà tôi đang tìm kiếm. Thực tế thay đổi này cần phải được thực hiện cho khoảng 10 trang web vì vậy tôi muốn nó yêu cầu ít liên hệ với các trang nội dung nhất có thể. –

+0

Nathan nhìn vào các sửa đổi của tôi, Phương pháp thứ hai sẽ cho phép bạn chỉ cần chạy qua các hành động điều khiển của bạn và thêm ViewData ["Title"] = "something" vào mỗi hành động trả về một View. Bạn có thể thực hiện tìm kiếm và thay thế cho số này –

+0

Tôi thích phương pháp thứ hai. Tốt đẹp. Thất bại một cái gì đó tốt hơn sau ngày hôm nay, tôi sẽ chấp nhận nó. :) –

0

Bạn có thể thử kiểm soát bằng chữ, mặc dù tôi nghi ngờ rằng sẽ không hoạt động trong tiêu đề tài liệu bên ngoài biểu mẫu asp.net. Bạn cũng có thể thử đặt tiêu đề thông qua mã-đằng sau.

1

Nếu bạn đang thực sự làm phiền (và tôi không thấy khoảng trắng do tại sao bạn sẽ bị cho là không quan trọng trong HTML), bạn có thể thử thiết lập nó trong code-behind một cái gì đó như thế này:

Page.Title = WebsiteSettings.WebsiteName + " " + Page.Title; 
+0

Xin lưu ý câu cuối cùng của câu hỏi của tôi: Tôi đang sử dụng MVC để code-behind không phải là một lựa chọn chấp nhận được. –

+0

Xin lỗi, đã bỏ lỡ phần đó - Bỏ qua. –

1

Sử dụng cụm từ thông dụng, như dagray đã nói, là két t và cách tiếp cận dễ nhất.

Mã này chỉ thay thế lần xuất hiện đầu tiên của dòng mới/ký tự trong thẻ tiêu đề đầu tiên.

void TrimTitleRegex(ref string content) 
{ 
    System.Text.RegularExpressions.Regex rgx = new System.Text.RegularExpressions.Regex(@"\<title\>(.*?)\<\/title\>"); 
    var result = rgx.Replace(content, 
    m => 
    { 
     var codeString = m.Groups[1].Value; 
     // then you have to evaluate this string 
     codeString = System.Text.RegularExpressions.Regex.Replace(codeString, @"\r\n?|\n", ""); 
     codeString = String.Format("<title>{0}</title>", codeString); 
     return codeString.Trim(); 
    }, 1); 

    content = result; 
} 
Các vấn đề liên quan