本文主要介绍如何添加一个custom application page as site welcome page
1、首先创建一个sharepoint 2013 empty solution, add a custom application page(farm only)named MyHomePage.
2、自定义这个MyHomePage,显示所需信息,包括后台代码的编辑。
3、更改MyHomePage.aspx页面首页<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>为具体的assmebly info,例:
<%@ Assembly Name="MyHomePage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=77a2aedaefb0d45b" %>
4、右键solution,添加一个module,named:HomePage, 替换module 下sample.txt为MyHomePage.aspx,同时修改里面的<%@ Page %>,
<%@ Page Language="C#" AutoEventWireup="true" Inherits="MyHomePage.Layouts.MyHomePage.MyHomePage" MasterPageFile="../_catalogs/masterpage/seattle.master" %>
指定具体的master file,不能DynamicMasterPageFile="~masterurl/default.master" ,同时去掉CodeBehind 标签,原因是copy这个页面没有后台。
NOTE:这里我们替换default.aspx中的DynamicMasterPageFile="~masterurl/default.mater"为MasterPageFile="../_catalogs/masterpage/seattle.master",其实这种方式不太好,原因在与sharepoint 2013本来支持动态更改 master文件,但是这里我们确把materpage固定了,所以客户是无法改变的。
SOLUTION:不指定DynamicMasterPageFile及MasterPageFile,后台将default.aspx页继承的LayoutsPageBase更改为PublishingLayoutPage
HTML:
<%@ Page Language="C#" Inherits="EArchive.EArchiveHome" %>
C#:
public partial class EArchiveHome : PublishingLayoutPage { protected void Page_Load(object sender, EventArgs e) { } }
module code:
<?xml version="1.0" encoding="utf-8"?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <Module Name="HomePage" Url="Pages" > <File Path="HomePageMyHome.aspx" Type="GhostableInLibrary" Url="MyHome.aspx" IgnoreIfAlreadyExists="FALSE" ReplaceContent="TRUE"> <Property Name="PublishingPageLayout" Value="~SiteCollection/_catalogs/masterpage/BlankWebPartPage.aspx, Blank Web Part page" /> </File> </Module> </Elements>
说明:Module name:HomePage,Url为Pages,Pages 是site 开启publishing feature之后sharepoint自动添加的一个page library,主要用于manage home or error SharePoint default pages.
重点需要说明的是<Property Name="PublishingPageLayout" Value="~SiteCollection/_catalogs/masterpage/BlankWebPartPage.aspx, Blank Web Part page" />这个property的作用是为这个MyHome.aspx页添加了一个PageLayout,
方便以后对这个homepage的添加与修改。
5、添加module的时候会默认在solution中add a feature,右键feature,添加feature EventReceiver,设置feature scope为site, 编辑FeatureActivated和FeatureDeactiving
FeatureActivated code:
public override void FeatureActivated(SPFeatureReceiverProperties properties) { SPSecurity.RunWithElevatedPrivileges(() => { SPSite site = properties.Feature.Parent as SPSite; using (site) { SPWeb web = site.RootWeb; web.AllowUnsafeUpdates = true; if (PublishingWeb.IsPublishingWeb(web)) { PublishingWeb pWeb = PublishingWeb.GetPublishingWeb(web); SPFile file = web.GetFile(web.ServerRelativeUrl + "/Pages/MyHome.aspx"); pWeb.DefaultPage = file; pWeb.Update(); } else { web.RootFolder.WelcomePage = "Pages/MyHome.aspx"; web.RootFolder.Update(); web.Update(); } web.AllowUnsafeUpdates = false; } }); }
注意:set welcome page的时候,需要check 当前的site是否开启了publishing feature,具体情况如上面代码所示。
FeatureDeactiving code:
public override void FeatureDeactivating(SPFeatureReceiverProperties properties) { SPSecurity.RunWithElevatedPrivileges(() => { SPSite site = properties.Feature.Parent as SPSite; using (site) { SPWeb web = site.RootWeb; web.AllowUnsafeUpdates = true; if (PublishingWeb.IsPublishingWeb(web)) { PublishingWeb pWeb = PublishingWeb.GetPublishingWeb(web); SPFile file = web.GetFile(web.ServerRelativeUrl + "/Pages/Home.aspx"); pWeb.DefaultPage = file; pWeb.Update(); } else { web.RootFolder.WelcomePage = "Pages/Home.aspx"; web.RootFolder.Update(); web.Update(); } web.AllowUnsafeUpdates = false; } }); }
注意:deactive feature需要将site homepage设置成default page。
6、OK,一个完整set SharePoint homePage 的应用completly。
补充:如果我们create a custom application page,这个页默认继承LayoutsPageBase,这个class我们通过反射会发现里面有check permission的逻辑验证,所以说只有site 的 viewpage或者read权限才可以访问这个custom page。
但是有些客户就是不想给我们任何权限,然后呢,还想能访问这个custom application page,怎么办呢?经过楼主不断的研究,发现了其中的奥妙,就在于页面后台代码继承的这个class:LayoutsPageBase,将这个class更改为Page, 那么任何权限的user就都可以访问这个custom application page。