aspx页面的内容敏感标题

时间:2014-12-02 15:18:04

标签: c# asp.net sharepoint sharepoint-2010

我正在开发一个包含很多不同aspx页面的Sharepoint项目,但我的ASP.net知识仍然有限。基本上,Web应用程序的核心是基于用户数据。让我们保持简单,只是假设您可以选择不同的用户数据,并且aspx页面将基于它呈现内容。

现在,跟踪浏览器中的所有标签并不总是很容易。作为解决方案,浏览器选项卡应在其标题中呈现用户名以及其他(静态)信息。我目前的解决方案是在this帖子的帮助下以编程方式设置标题。结果,这就是我到目前为止所做的:

现有的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的帮助下,我发现您还可以在自定义母版页(see this)中添加代码。嗯,这也有效。我只需要编辑一个文件。这是一个好的做法还是NoGo?

2 个答案:

答案 0 :(得分:0)

你知道你可以做(​​在代码中)Page.Title = "My custom title string"对吗?

哦,如果它是一些属性的常见结构,如果你上课

public class MyCustomBasePage Inherits Page

然后在THERE中放入OnLoad事件中的Page.Title = ???

然后,每个内容页面都可以从MyCustomBasePage继承 e.g。

Public class MyExamplecontentPage Inherits MyCustomBasePage

跟进评论...如果您在母版页级别设置默认标题并覆盖标题和内容页面级别,则需要阅读此其他条目:How to set Page's Title from a web content page in ASP.NET 3.5

答案 1 :(得分:0)

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

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

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

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