繁体   English   中英

ASPX页面的内容敏感标题

[英]Content sensitive title for aspx page

我正在从事一个Sharepoint项目,该项目需要处理许多不同的aspx页面,但是我的ASP.net知识仍然有限。 基本上,Web应用程序的核心基于用户数据。 让我们保持简单,仅假设您可以选择不同的用户数据,aspx页面将基于该数据呈现内容。

现在,跟踪浏览器中的所有标签并不总是那么容易。 作为解决方案,浏览器选项卡应在其标题(除了其他(静态)信息之外)中呈现用户名。 我当前的解决方案是在这篇文章的帮助下以编程方式设置标题。 结果,这就是我到目前为止所拥有的:

已经存在的aspx页从资源文件中检索一些静态字符串以呈现标题的静态部分。

<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
  <asp:Literal runat="server" text="<%$Resources:UserManager.Resource,GeneralPageTitle%>">                
  </asp:Literal>
</asp:Content>

现在,我要根据选定的用户内容来调整标题。 我的后台代码在Page_Load函数中做了必要的事情

protected void Page_Load(object sender, EventArgs e)
{
    // (...) some stuff happening here

    if (Page.Master != null)
    {
        var web = SPContext.Current.Web;
        var contentPlaceHolder = (ContentPlaceHolder)Page.Master.FindControl("PlaceHolderPageTitle");
        if (contentPlaceHolder == null) return;

        string oldText = String.Empty;
        foreach (var control in contentPlaceHolder.Controls)
        {
            var textControl = control as ITextControl;
            if (textControl != null)
            {
                oldText += textControl.Text;
            }
        }

        contentPlaceHolder.Controls.Clear();

        var literalControl = new LiteralControl();
        var userName = web.GetCurrentUserName();
        literalControl.Text = String.Format("{0} - {1}", oldText, userName);
        contentPlaceHolder.Controls.Add(literalControl);
    }
}

当然,由于存在许多不同的aspx页,因此由于代码重复,您不会将此代码放入每个Page_Load函数中。 但是对于这个例子,它将解决问题。

基本上,是的,这可行。 但是它有点hacky。 此外,我仍然不喜欢编辑所有aspx的代码隐藏文件的想法(其中有很多)。 我宁愿选择一个更清洁的解决方案。 有什么方法可以不同地实现同一目标吗?

更新

在SazooCat的帮助下,我发现您还可以将代码添加到自定义母版页中( 请参阅参考资料)。 好吧,那也行。 而且我只需要编辑一个文件。 这是好习惯还是NoGo?

您知道您可以(在后面的代码中)做Page.Title = "My custom title string"对吗?

哦,如果这是某些属性的常用构造,那么如果您制作了一个类

public class MyCustomBasePage Inherits Page

然后在这里放入Page.Title = ??? 在OnLoad事件中

然后,您的每个内容页面都可以从MyCustomBasePage继承,例如

Public class MyExamplecontentPage Inherits MyCustomBasePage

注释后跟进...如果您要在母版页级别设置默认标题,并在标题和内容页级别上覆盖,则需要阅读此其他条目: 如何从ASP.NET中的Web内容页面设置页面的标题3.5

这是我现在要走的路线,因为它最适合我的需求。

首先,我创建了一个自定义用户控件

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="BrowserTabInfo.ascx.cs" Inherits="Controls.BrowserTabInfo" %>
<asp:Literal runat="server" ID="userName"></asp:Literal>

执行一些代码隐藏。

protected void Page_Load(object sender, EventArgs e)
{
    var web = SPContext.Current.Web;
    if (web == null) return;

    var userName = web.GetCurrentUserName();
    userName.Text = "- " + userName;
}

然后将用户控件插入母版页。

<title id="onetidTitle"><asp:ContentPlaceHolder id="PlaceHolderPageTitle" runat="server"/><browsertabinfo:BrowserTabInfoControl id="browsertabinfo" runat="server"/></title>

即使总有一天会有不同的母版页,您也只需将用户控件再次插入该母版页即可获得相同的功能。 您只需要触摸(基本上)一个文件,而不需要触摸许多内容页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM