Obtenha a página .aspx implantada no receptor de recursos para adicionar WebPart
-
10-12-2019 - |
Pergunta
Tenho uma solução SharePoint que implanta um aspx
página em uma pasta personalizada no Layouts
pasta.Preciso colocar essa página no Feature Event Receiver
para que eu possa adicionar a ele um WebPart
.
No FeatureActivated
método quando estou tentando usar este código:
SPFile file = web.GetFile("_layouts/My Folder/MyPage.aspx");
Este código retorna um File not found exception
.
Como posso obter uma referência a esta página?Este erro está ocorrendo porque a página ainda não foi implantada?
Solução
Obrigado por Spongeroberto Squarepantalones
e SPArchaeologist
ajuda, fiz o seguinte:
- Eu criei um
Module
na minha solução SharePoint e adicionei a ela umaspx
página. - Nisso
aspx
página eu adicionei umWebPartPages:SPWebPartManager
e umWebPartPages:WebPartZone
. - eu editei o
Elements.xml
arquivo no módulo para implantar a página em umDocument Library
.(Preciso acessar esta página apenas de um site específico). - No
FeatureActivated
método noFeature Event Receiver
Eu adicionei código para criar umWebPart
, obtenha esta página como umSPFile
e usou umSPLimitedWebPartManager
para adicionar meu criadoWebPart
.(Eu fiz isso e não tinha criado umWepPart
noaspx
página diretamente porque o WebPart exibe itens do SharePoint de umDocument Library
e use um SharePointView
que são implantados na mesma solução, portanto, seu GUID sempre muda).
Outras dicas
Os itens são implantados antes o receptor do evento.O problema é que você está tentando ler um arquivo hive.Isso não funcionará com o método SPWeb.GetFile.Esse método destina-se a arquivos armazenados nessa web.
Você ainda pode ler o arquivo, no entanto.Eu precisava fazer o mesmo e escrevi um método como este:
/// <summary>
/// get the proper path to the hive
/// </summary>
private static string GetUtilPath(string path)
{
return SPUtility.GetGenericSetupPath(@"TEMPLATE\LAYOUTS\MyModule\" + path);
}
/// <summary>
/// Access a file in the SharePoint hive
/// </summary>
/// <param name="path">the path relative to the layouts folder</param>
private static byte[] GetHiveFile(string path)
{
string utilPath = GetUtilPath(path);
using(FileStream fs = new FileStream(utilPath, FileMode.Open, FileAccess.Read))
{
BinaryReader br = new BinaryReader(fs);
long numbytes = new FileInfo(utilPath).Length;
return br.ReadBytes((int)numbytes);
}
}
Então você pode ler um arquivo do hive assim:
byte[] file = GetHiveFile(@"myfolder\myfile.txt");
Com base em outras respostas (ver esse ou esse) SPFile.GetFile(string) não pode ser usado para obter um "SPFile" na pasta _layout.Há outra maneira de ler a página (como alguma resposta sugerida), mas no final você obteria apenas um stream/bytearray ou algo semelhante - você está tentando adicionar uma web part, então temo que isso não ajude muito.Isso ocorre porque, no que diz respeito ao SharePoint, _layout é uma pasta virtual do IIS e os arquivos dentro dela NÃO são vistos como SPfile.
Dito isto, até onde eu sei, adicionar uma web part a uma página de aplicativo nem é compatível:se você tentar adicionar uma zona de web part com uma web part dentro, deverá receber um erro semelhante a "“Tag de servidor desconhecida WebPartZone" (consulte este blog ou esta resposta de Dave).A Web Part na página do aplicativo só é possível se usada como controle da Web padrão (e ainda há alguns problemas com cache e outros).
Se você precisa, sua melhor aposta parece ser abrir o arquivo programaticamente como um arquivo de texto e, em seguida, adicionar as tags necessárias manualmente - você não poderá usar o gerenciador de web part.De qualquer forma, eu tentaria ver se consigo reimplantar essa página em uma biblioteca de páginas ou algo semelhante e transformá-la em uma página de publicação padrão.