UpdatePanel asyncpostback后页面丢失标题

时间:2009-03-09 18:05:34

标签: asp.net asp.net-ajax master-pages

我刚刚注意到,在我从主页面UpdatePanel内部执行asyncpostback后,我的页面标题将重置为标准的“无标题页面”。在母版页内回发期间,标题不会丢失(例如,当我点击母版页内的搜索框按钮时)。

我认为通过使用不同的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 个答案:

答案 0 :(得分:7)

我们在其中一个网站上遇到了这个问题。

立即修复是在主页面codebehind page_load方法中重置标题。

显然,当发生ajax调用时,它会重新运行母版页。这导致我们的头衔消失了。

例如:

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

更好的解决方法是删除MS updatepanel垃圾并开始使用JSON / jQuery,你实际上可以控制这些调用。

答案 1 :(得分:5)

您是否反对使用内容页面的标题属性?

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

您也可以在页面加载中以编程方式访问它...

答案 2 :(得分:3)

如果删除标题标记中的空格,可以解决这个奇怪的错误:

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

在Sharepoint 2010上测试

答案 3 :(得分:1)

为什么不在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;
        });
});

答案 4 :(得分:0)

当您以编程方式设置标题并且仅在不是PostBack时设置标题时会发生这种情况。只需重写保存/加载回发方法,即可将标题保存在viewstate包中。

- (NSDate*)firstDayOfWeek
{
    NSCalendar* calender = [[NSCalendar currentCalendar] copy];
    [calender setFirstWeekday:2]; //Override locale to make week start on Monday
    NSDate* startOfTheWeek;
    NSTimeInterval interval;
    [calender rangeOfUnit:NSWeekCalendarUnit startDate:&startOfTheWeek interval:&interval forDate:self];
    return startOfTheWeek;
}

答案 5 :(得分:-2)

您可以将页面标题放在Viewstate中,然后只需抓住按钮回发Click事件中的字符串并将其分配给Page.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;

    }