Ошибка проигрывания страницы после обновления asyncpostback UpdatePanel
Недавно я недавно заметил, что мой титул страницы будет reset на стандартную "Untitled Page" после выполнения asyncpostback изнутри моего 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>
Ответы
Ответ 1
Вы не согласны с использованием свойства Title на странице содержимого?
<%@ Page Title="Your Page Title" Language="vb" AutoEventWireup="false" MasterPageFile="~/MasterPages/...
Вы также можете получить доступ к этому программно в загрузке страницы...
Ответ 2
Мы столкнулись с этой точной проблемой на одном из наших сайтов.
Непосредственным решением было reset заголовок в методе главной страницы codebehind page_load.
По-видимому, когда происходит вызов ajax, он перезапускает главную страницу. Это привело к исчезновению нашего титула.
Например:
protected void Page_Load(object sender, EventArgs e) {
this.Page.Title = "whatever title you have...";
}
Лучше исправить это, чтобы удалить хладнокровие MS updatepanel и начать использовать JSON/jQuery, где у вас действительно есть приличный контроль над вызовами.
Ответ 3
Это странная ошибка, которая может быть обработана, если вы удалите пробелы в теге title, например:
<title><asp:ContentPlaceHolder id="title" runat="server"></asp:ContentPlaceHolder></title>
Протестировано на Sharepoint 2010
Ответ 4
Вместо того, чтобы изменять код на стороне сервера, почему бы просто не исправить его в 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;
});
});
Ответ 5
Это происходит, когда вы устанавливаете заголовок прогеймически и только тогда, когда он не является PostBack. Просто перепишите методы сохранения/загрузки 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;
}
Ответ 6
Вы можете поместить заголовок страницы в Viewstate, а затем просто захватить строку в кнопке postback Нажмите событие и назначьте его на страницу. Title
public string MyPageTitle
{
get
{
return (string)ViewState["MyPageTitle"];
}
set
{
ViewState["MyPageTitle"] = value;
}
}
В поле Назначение загрузки страницы: MyPagetitle= "Мое холодное название веб-страницы";
Затем в событии нажатия кнопки:
protected void MyLinkButton_Click(object sender, EventArgs e)
{
Page.Title = MyPageTitle;
}