Comment accéder à un fichier dans le dossier en cours ou URL _layouts?
Question
Mon code derrière le code de la page Web ASPX utilise un transform.xsl pour faire une transformation xslt personnalisée.
Scénario 1 :. Essayez d'obtenir le fichier à partir du dossier _layouts
SPWeb web = SPContext.Current.Web;
SPFile file = web.GetFile(@"/layouts/MyFeature/transform.xsl");
Remarque: Le fichier est accesible sur cette URL http: // monsite: 8080 / _layouts / MyFeature /transform.xsl lors de l'utilisation du navigateur.
Scénario 2 : Essayez d'obtenir le fichier du courant (http: // monsite: 8080 / MyFeature / MyPage.aspx). Url
SPWeb web = SPContext.Current.Web;
SPFile file = web.GetFile(@"transform.xsl");
ou
SPFile file = web.GetFile(@"MyFeature/transform.xsl");
ou
SPFile file = web.GetFile(@"/MyFeature/transform.xsl");
Tous les scénarios échouent, comment résoudre ce problème?
Solution
Le « transform.xsl » est maintenant situé à 'MyFeature / transform.xsl et je l'ai suivi la pointe de Anders Rask, et mon apparence de code comme ceci maintenant:
SPWeb web = SPContext.Current.Web;
XslCompiledTransform transformer = new XslCompiledTransform();
XsltSettings settings = new XsltSettings(true, true);
string xslLocation = web.Url + "/FormWrapper/transform.xsl";
transformer.Load(xslLocation, settings, GetResolverWithDefaultCredentials());
// Do XSLT transform...
La solution
Je suis assez sûr SPWeb.GetFile () retourne vos pages du site, comme default.aspx. Aussi votre fichier XSLT nest pas un SPFile s'il se trouve dans le dossier _layouts.
Au lieu de tenter quelque chose de similaire au-dessous du code (note code boilerplate si la gestion des erreurs, etc. doivent être ajoutés)
// fetch xsl processor
XslCompiledTransform processor = GetXslt(@"/layouts/MyFeature/transform.xsl");
StringWriter writer = new StringWriter(CultureInfo.CurrentCulture);
// Transform XSLT code here
private static XslCompiledTransform GetXslt(string xsltUrl)
{
XslCompiledTransform processor = new XslCompiledTransform(false);
bool enableDocumentFunctions = true;
bool enableScript = true;
XsltSettings settings = new XsltSettings(enableDocumentFunctions, enableScript);
// add error handling here
processor.Load(xsltUrl, settings, GetResolverWithDefaultCredentials());
return processor;
}
// use resolver to avoid getting security exceptions
private static XmlUrlResolver GetResolverWithDefaultCredentials()
{
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
return resolver;
}
Autres conseils
Vous pouvez écrire un module Feature « que » votre uploads transform.xsl dans une bibliothèque de documents (style bibliothèque par exemple) qui vous permet d'accéder au fichier en tant que SPFile.