我在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;
}
这给了我一个与asp.net treeview控件一起使用的XML结构(我也使用CssFriendly扩展器来获得更好的代码)
我的问题是,如果我使用代码在我的电脑上登录,该代码可以让我访问树层次结构中的较低级别(它是一个组织层次结构),它会以某种方式“记住”我登录的级别。因此,当我的同事从她的计算机上用另一个代码进行测试,访问树中的另一个地方时,她就会和我一样的树。 (该树应该显示自己的级别和向下。)
我添加了一个html-comment来显示它传递给函数的orgid,并且传递的orgid是正确的。所以要么treeview缓存了服务器端的东西,要么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”是aspx文件中的asp:Literal。
编辑:
我把它缩小了。所有函数都返回正确的值。它只是不绑定它。 我怀疑CssFriendly适配器与它有关。
我禁用了CssFriendly适配器,问题仍然存在......
在调试中单步执行它一直是正确的,步进器站在“tvNavtree.DataBind();”我可以将指针悬停在tvNavtree.Datasource上,看看它实际上有正确的数据。所以必须在绑定过程中出现错误......
答案 0 :(得分:0)
我通常会怀疑问题是将orgid
传递给您的方法,但是您说您已经检查过以确保传递了正确的代码。只是为了确认,向我们展示为其赋值的代码。
此外,您的代码存在一些问题,SQL注入风险就是其中之一。 orgid是一个int,提供一些保护,但如果在某些时候orgid被更改为需要组织的字符,开发人员可能只是将数据类型更改为字符串,突然打开应用程序进行SQL注入。您应该删除String.Fotmat,而是使用参数化查询。
答案 1 :(得分:0)
我发现了问题。 XmlDataSource组件具有缓存功能,默认情况下已启用。当我禁用它时,一切都很顺利。