2010-03-03 14 views
0

J'ai des difficultés à obtenir la méthode XslCompiledTransform.Load pour prendre un chemin de serveur. J'ai googlé et trouvé que je dois faire quelque chose comme:Obtention de XslCompiledTransform.Load pour charger un fichier dans une liste SharePoint

xslt.Load(System.Web.HttpContext.Server.MapPath(xslPath), 
      XsltSettings.Default, new XmlUrlResolver()); 

Mais il a retourné une erreur en disant HttpContext est nulle.

J'ai aussi essayé:

xslt.Load(System.Web.HttpServerUtility.MapPath(xslPath), 
      XsltSettings.Default, new XmlUrlResolver()); 

Cela aussi a retourné une erreur indiquant une référence d'objet est nécessaire pour le champ non statique, la méthode ou la propriété System.Web.HttpServerUtility.MapPath(string)

Le xslPath a un chemin qui pointe vers un fichier xsl dans Sharepoint Web. Je veux juste que XslCompiledTransform charge le fichier xsl avec le chemin du serveur. C'est possible? Si oui, quelle est la manière appropriée ou la manière hackish de le faire?

EDIT: J'ai accès à un objet SPWeb qui contient le chemin d'accès au fichier xsl. Cependant, quand je vérifie le ServerRelativeUrl, il dit simplement "/MyTree/xsl.xsl". Le problème ici est que je n'ai pas pu obtenir XslCompiledTransform.Load pour charger le fichier à partir de la liste SharePoint.

Merci.

Répondre

1

Ce que je trouve à la fin est que si je passe dans une URL qui ne ressemble pas à un chemin local, la classe XslCompiledTransform passera automatiquement à un mode différent pour lire le chemin en tant qu'URL.

Si je transmets une chaîne contenant uniquement le nom du fichier, XslCompiledTransform recherchera le fichier sur mon disque dur local. De même si je passe quelque chose comme /myFolder/myXsl.xsl.

Cependant, si je transmets une URL de point de partage par ex. web.ParentWeb.Url + NameOfFile, alors il ira le lire à partir de l'URL Sharepoint.

Je ne suis pas sûr à 100% pourquoi il fait l'interrupteur automatique, mais au moins ce qui précède a fonctionné pour moi.

2

Lors du traitement d'une requête, le HttpContext courant est HttpContext.Current. Dans un Page/UserControl/WebPart c'est également la propriété Context.

HttpContext.Context.Server.MapPath(xslPath) 

Si votre méthode est pas appelée lors du traitement d'une demande, HttpContext.Current sera nulle. Dans ce cas, vous pouvez mapper le chemin manuellement.

public string MapPath(string path) 
{ 
    if (HttpContext.Current != null) 
     return HttpContext.Current.Server.MapPath(path); 

    path = path.Replace("/", @"\"); 
    if (path.StartsWith(@"~\")) { 
     path = path.Substring(2); 
    } else if (path.StartsWith(@"\")) { 
     path = path.Substring(1); 
    } 
    // a non-prefixed path is already relative to your web server root 

    return Path.Combine(HttpRuntime.AppDomainAppPath, path); 
} 

Ce qui précède est pour mapper des chemins de disque dans ASP.NET en général.

Si le fichier est contenu dans vous objet SPWeb, vous devez utiliser SPWeb.GetFile

SpWeb web; 

SPFile file = web.GetFile(path); 

XmlReader r = XmlReader.Create(file.OpenBinaryStream()); 
xslt.Load(r); 
+0

@Lachlan Roche: de quel paquet est Path? En outre, le chemin du fichier xsl est récupéré à partir de Sharepoint afin qu'il ne commence pas par ~/ou /. Je pense que cela vient tout droit d'une liste. – BeraCim

+0

@BeraCim System.IO.Path –

+0

@Lachlan Roche: merci pour la réponse. J'ai mis dans le ~ dans xslpath. Malheureusement cette fois, la méthode Load a indiqué qu'elle ne pouvait pas trouver une partie du chemin C: \ Inetpub \ wwwroot \ wss \ VirtualDirectories \ 80 \ ~ \ {chaîne de répertoire d'origine xslpath}. Si je retire le ~, le répertoire racine est devenu c: \ à la place.Comment est-ce que je fais la méthode de charge pour pointer vers la liste de Sharepoint réelle au lieu du système local? – BeraCim