У меня есть следующий метод в файле App_Code / Globals.cs:
public static XmlDataSource getXmlSourceFromOrgid(int orgid)
{
XmlDataSource xds = new XmlDataSource();
var ctx = new SensusDataContext();
SqlConnection c = new SqlConnection(ctx.Connection.ConnectionString);
c.Open();
SqlCommand cmd = new SqlCommand(String.Format("select orgid, tekst, dbo.GetOrgTreeXML({0}) as Subtree from tblOrg where OrgID = {0}", orgid), c);
var rdr = cmd.ExecuteReader();
rdr.Read();
StringBuilder sb = new StringBuilder();
sb.AppendFormat("<node orgid=\"{0}\" tekst=\"{1}\">",rdr.GetInt32(0),rdr.GetString(1));
sb.Append(rdr.GetString(2));
sb.Append("</node>");
xds.Data = sb.ToString();
xds.ID = "treedata";
rdr.Close();
c.Close();
return xds;
}
Это дает мне XML-структуру для использования с древовидным элементом управления asp.net (я также использую расширитель CssFriendly для получения более приятного кода)
Моя проблема в том, что, если я вхожу в систему на моем компьютере с кодом, который дает мне доступ на более низком уровне в древовидной иерархии (это иерархия оргианизации), он каким-то образом «запоминает», на каком уровне я выполняю вход. Поэтому, когда моя коллега тестирует со своего компьютера другой код, предоставляя доступ к другому месту в дереве, она получает то же дерево, что и я.
(Дерево должно показывать ваш собственный уровень и вниз.)
Я добавил html-комментарий, чтобы показать, какой оргид он передает функции, и переданный оргид корректен. Так что либо древовидная структура кэширует что-то на стороне сервера, либо sqlquery кэширует ее результат каким-то образом ...
Есть идеи?
Функция Sql:
ALTER function [dbo].[GetOrgTreeXML](@orgid int)
returns XML
begin RETURN
(select org.orgid as '@orgid',
org.tekst as '@tekst',
[dbo].GetOrgTreeXML(org.orgid)
from tblOrg org
where (@orgid is null and Eier is null) or Eier=@orgid
for XML PATH('NODE'), TYPE)
end
Дополнительный код по запросу:
int orgid = int.Parse(Session["org"].ToString());
string orgname = context.Orgs.Where(q => q.OrgID == orgid).First().Tekst;
debuglit.Text = String.Format("<!-- Id: {0} \n name: {1} -->", orgid, orgname);
var orgxml = Globals.getXmlSourceFromOrgid(orgid);
tvNavtree.DataSource = orgxml;
tvNavtree.DataBind();
Где "debuglit" - это asp: литерал в файле aspx.
EDIT:
Я сузил это. Все функции возвращают правильные значения. Это просто не связано с этим. Я подозреваю, что адаптер CssFriendly как-то связан с ним.
Я отключил адаптер CssFriendly, и проблема остается ...
Пройдя через него в отладке, он все время корректен, а степпер стоит на "tvNavtree.DataBind ();" Я могу навести указатель на источник tvNavtree.Datasource и увидеть, что он действительно содержит правильные данные. Так что что-то должно быть не так в процессе привязки ...