2009-03-09 27 views
14

Gần đây tôi đã nhận thấy rằng tiêu đề trang của tôi sẽ đặt lại thành "Trang không có tiêu đề" chuẩn sau khi tôi thực hiện một asyncpostback từ bên trong trang chính của tôi UpdatePanel. Tiêu đề sẽ không bị mất trong quá trình đăng lại từ bên trong trang chính (chẳng hạn như khi tôi nhấp vào nút hộp tìm kiếm bên trong trang chính).Trang mất tiêu đề sau UpdatePanel asyncpostback

Tôi giả định rằng bằng cách sử dụng contentplaceholder khác để đặt tiêu đề tài liệu, tôi sẽ tránh các vấn đề như thế này, nhưng dường như tôi đã sai. Có cái gì khác tôi đang thiếu khác hơn là phải rõ ràng đặt tiêu đề trong mã phía sau của trang ASPX (mà tôi đã hy vọng để tránh với cách nó được thiết lập dưới đây)?

Dưới đây là ý chính cơ bản của trang web của tôi được gọi trang Master (thạc sĩ mã trang dưới đây)

<asp:Content ID="Content1" ContentPlaceHolderID="title" Runat="Server"> 
    Page Title 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="head" Runat="Server"> 
    <script type="text/javascript"> 
     //random javascript validators 
    </script> 
</asp:Content> 
<asp:Content ID="Content3" ContentPlaceHolderID="content" Runat="Server"> 
    <div class="title"> 
     Account Management 
    </div> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      //Username + Password Set Form 
     </ContentTemplate>  
    </asp:UpdatePanel> 

</asp:Content> 

Đây là các trang Master. ASP.NET AJAX ScriptManager được đặt đầu tiên sau thẻ <form> trong cơ thể.

<head id="Head1" runat="server"> 
    <title> 
     <asp:ContentPlaceHolder id="title" runat="server"> 
     </asp:ContentPlaceHolder> 
    </title> 
     //Stylesheet references 

    <script type="text/javascript"> 
     //Random javascript functions 
    </script> 

    <asp:ContentPlaceHolder id="head" runat="server"> 
    </asp:ContentPlaceHolder> 
</head> 

Trả lời

5

Bạn có phản đối việc sử dụng thuộc tính Tiêu đề của Trang nội dung không?

<%@ Page Title="Your Page Title" Language="vb" AutoEventWireup="false" MasterPageFile="~/MasterPages/... 

Bạn cũng có thể truy cập này theo chương trình trong tải trang ...

+1

Cảm ơn bạn đã khiến tôi cảm thấy như một thằng ngốc :) – TheTXI

+1

Tôi đã có cùng trải nghiệm tuần trước ... – TGnat

7

Chúng tôi đã gặp sự cố chính xác này trên một trong các trang web của chúng tôi.

Khắc phục ngay lập tức là đặt lại tiêu đề trong phương thức page_load page codebehind chính.

Dường như khi cuộc gọi ajax xảy ra, nó sẽ chạy lại trang chính. Điều này đã khiến tiêu đề của chúng ta biến mất.

Ví dụ:

protected void Page_Load(object sender, EventArgs e) { 
    this.Page.Title = "whatever title you have..."; 
} 

Một sửa chữa tốt hơn là để thả các updatepanel tào lao MS và bắt đầu sử dụng JSON/jQuery mà bạn thực sự có một số kiểm soát khá so với các cuộc gọi.

-2

Bạn có thể đặt trang tiêu đề trong ViewState và sau đó chỉ cần lấy các chuỗi trong các sự kiện Click nút postback và gán nó vào trang. Tiêu đề

public string MyPageTitle 
    { 
     get 
     { 
      return (string)ViewState["MyPageTitle"]; 
     } 
     set 
     { 
      ViewState["MyPageTitle"] = value; 
     } 
    } 

Khi tải trang chỉ định: MyPageTitle = "My Cool Page Title"; Sau đó, trong sự kiện nhấn nút:

protected void MyLinkButton_Click(object sender, EventArgs e) 
    { 

     Page.Title = MyPageTitle; 

    } 
1

Thay vì thay đổi mã phía máy chủ của bạn, tại sao không chỉ sửa chữa nó trong JS:

$(function(){ 
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    if (!(prm)) return; 
    document.orginalTitle=document.title; 
    prm.add_endRequest(function(s, e){ 
     if (document.title.replace(/\s/g,"").length==0) 
      document.title=document.orginalTitle; 
     }); 
}); 
3

Là một lỗi kì lạ mà có thể được workedaround nếu bạn loại bỏ các không gian trong thẻ tiêu đề như:

<title><asp:ContentPlaceHolder id="title" runat="server"></asp:ContentPlaceHolder></title> 

Thử nghiệm trên Sharepoint 2010

0

Điều này xảy ra khi bạn đặt tiêu đề một cách progammatically và chỉ khi không phải là PostBack. Chỉ cần viết lại các phương thức lưu/tải postback để giữ tiêu đề trong túi viewstate.

protected override void LoadViewState(object savedState) 
    { 
     object[] allStates = (object[])savedState; 
     if (allStates[0] != null) 
      base.LoadViewState(allStates[0]); 
     if (allStates[1] != null) 
      Page.Title = (string)allStates[1]; 
    } 

    protected override object SaveViewState() 
    { 
     object[] allStates = new object[2]; 
     object baseState = base.SaveViewState(); 
     string pageTitle = Page.Title; 
     allStates[0] = baseState; 
     allStates[1] = pageTitle; 
     return allStates; 
    } 
Các vấn đề liên quan