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?

Foi útil?

Solução

Obrigado por Spongeroberto Squarepantalones e SPArchaeologist ajuda, fiz o seguinte:

  1. Eu criei um Module na minha solução SharePoint e adicionei a ela um aspx página.
  2. Nisso aspx página eu adicionei um WebPartPages:SPWebPartManager e um WebPartPages:WebPartZone.
  3. eu editei o Elements.xml arquivo no módulo para implantar a página em um Document Library.(Preciso acessar esta página apenas de um site específico).
  4. No FeatureActivated método no Feature Event Receiver Eu adicionei código para criar um WebPart, obtenha esta página como um SPFile e usou um SPLimitedWebPartManager para adicionar meu criado WebPart.(Eu fiz isso e não tinha criado um WepPart no aspx página diretamente porque o WebPart exibe itens do SharePoint de um Document Library e use um SharePoint View 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top