我正在开发一个包含很多不同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?
答案 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>
即使有一天会有不同的母版页,您只需要再次将用户控件插入该母版页以获得相同的功能。而且你只需触摸(基本上)一个文件而不是几十个内容页面。