2010-03-03 2 views
0

У меня возникли трудности с получением метода XslCompiledTransform.Load для перехода к серверу. Я гугле вокруг и обнаружил, что мне нужно сделать что-то вроде:Получение XslCompiledTransform.Load для загрузки файла в список SharePoint

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

Но возвратил ошибку говоря HttpContext равна нулю.

Я также попытался:

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

Это также возвратил ошибку говоря ссылка на объект необходим для не-статического поля, метода или свойства System.Web.HttpServerUtility.MapPath(string)

xslPath имеет путь, который указывает на xsl-файл в веб-узле Sharepoint. Я просто хочу, чтобы XslCompiledTransform загрузил файл xsl с помощью пути к серверу. Является ли это возможным? Если да, то каков правильный способ или хакерский способ сделать это?

EDIT: У меня есть доступ к объекту SPWeb, который содержит путь к файлу xsl. Однако, когда я проверяю ServerRelativeUrl, он просто говорит «/MyTree/xsl.xsl». Проблема здесь в том, что я не мог заставить XslCompiledTransform.Load загрузить файл из списка SharePoint.

Спасибо.

ответ

1

То, что я нашел в конце концов, что, если я прохожу в URL, который не похож на локальный путь, класс XslCompiledTransform автоматически перейдет в другой режим, чтобы прочитать путь в виде URL-адреса.

Если я передаю строку, содержащую только имя файла, XslCompiledTransform будет искать файл на моем локальном жестком диске. Аналогично, если я передаю что-то вроде /myFolder/myXsl.xsl.

Однако, если я передаю URL-адрес sharepoint, например. web.ParentWeb.Url + NameOfFile, то он будет отключен, чтобы прочитать его с URL-адреса Sharepoint.

Я не уверен на 100%, почему он делает автоматический выключатель, но по крайней мере выше это работало для меня.

2

Во время обработки запроса текущий HttpContext является HttpContext.Current. В странице/UserControl/WebPart это также свойство Context.

HttpContext.Context.Server.MapPath(xslPath) 

Если ваш метод не вызывается при обработке запроса, HttpContext.Current будет нулевым. В этом случае вы можете сопоставить маршрут вручную.

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); 
} 

Вышеупомянутое предназначено для сопоставления путей к диску в ASP.NET в целом.

Если файл содержится в вас SPWeb объект, вы должны использовать SPWeb.GetFile

SpWeb web; 

SPFile file = web.GetFile(path); 

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

@ Lachlan Roche: какой пакет Путь? Кроме того, путь к файлу xsl извлекается из Sharepoint, поэтому он не начинается с ~/или /. Я думаю, что это просто происходит из списка. – BeraCim

+0

@BeraCim System.IO.Path –

+0

@Lachlan Roche: спасибо за ответ. Я поместил в ~ xslpath. К сожалению, на этот раз метод Load сказал, что он не может найти часть пути C: \ Inetpub \ wwwroot \ wss \ VirtualDirectories \ 80 \ ~ \ {оригинальная строка каталога xslpath}. Если я вывожу ~, корневой каталог обратился к c: \ вместо этого.Как заставить метод Load указывать фактический список Sharepoint вместо локальной системы? – BeraCim

Смежные вопросы