Страница, теряющая заголовок после UpdatePanel asyncpostback - PullRequest
14 голосов
/ 09 марта 2009

Я только недавно заметил, что заголовок моей страницы будет сброшен до стандартной «Безымянной страницы» после того, как я выполню асинхронную обратную передачу изнутри моего UpdatePanel на главной странице. Заголовок не будет потерян во время обратной передачи изнутри главной страницы (например, когда я нажму на кнопку окна поиска внутри главной страницы).

Я предполагал, что, используя другой contentplaceholder специально для установки заголовка документа, я собирался избежать подобных проблем, но, очевидно, я ошибался. Есть ли что-то еще, что я упускаю, кроме необходимости явно установить заголовок в коде позади страницы ASPX (чего я надеялся избежать при том, как это было настроено ниже)?

Вот основная суть моей страницы, которая вызывает главную страницу (код главной страницы ниже)

<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>

Это мастер-страница. ASP.NET AJAX ScriptManager первым помещается после тега <form> в теле.

<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>

Ответы [ 6 ]

7 голосов
/ 09 марта 2009

Мы столкнулись с этой проблемой на одном из наших сайтов.

Немедленное исправление состояло в том, чтобы сбросить заголовок в коде главной страницы за методом page_load.

Видимо, когда происходит вызов ajax, он перезапускает главную страницу. Это заставляло наше название исчезать.

Например:

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

Лучшее решение - удалить дерьмо из панели обновлений MS и начать использовать JSON / jQuery, где у вас есть хороший контроль над вызовами.

5 голосов
/ 09 марта 2009

Вы против использования свойства Title страницы содержимого?

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

Вы также можете получить доступ к этому программно на странице загрузки ...

3 голосов
/ 19 февраля 2014

Это странная ошибка, которую можно обойти, если убрать пробелы в теге title, например:

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

Проверено на Sharepoint 2010

1 голос
/ 16 августа 2011

Вместо того, чтобы изменять код на стороне сервера, почему бы просто не исправить его в 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;
        });
});
0 голосов
/ 01 июня 2015

Это происходит, когда вы устанавливаете заголовок программно и только тогда, когда нет PostBack. Просто перепишите методы сохранения / загрузки постбэков, чтобы удерживать заголовок в сумке состояния.

    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;
    }
0 голосов
/ 10 декабря 2009

Вы можете поместить заголовок страницы в Viewstate, а затем просто взять строку в кнопке postback click Event и назначить ее для Page.Title

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

При назначении загрузки страницы: MyPageTitle = "My Cool Web Page Title"; Затем в событии нажатия кнопки:

protected void MyLinkButton_Click(object sender, EventArgs e)
    {

       Page.Title = MyPageTitle;

    }
...