Asp.net asp:QueryStringParameter和空查询字符串参数

Asp.net asp:QueryStringParameter和空查询字符串参数,asp.net,.net,sql-server,sqldatasource,querystringparameter,Asp.net,.net,Sql Server,Sqldatasource,Querystringparameter,我有asp:GridView使用asp:SqlDataSource显示客户端请求。我想按客户端限制显示的信息: View.aspx必须显示所有内容,View.aspx?client=1必须仅显示来自客户端ID#1的请求 因此,我使用进行查询“EXEC getRequests@client” 当指定某个客户端时,一切都正常工作。但如果没有,就不要这样做 我使用SSMS测试了我的SP—它在两种情况下都正常工作—指定了参数和未指定参数(NULL显式传递) 我该怎么办?您需要为这些情况下的参数定义一个默

我有
asp:GridView
使用
asp:SqlDataSource
显示客户端请求。我想按客户端限制显示的信息:

View.aspx
必须显示所有内容,
View.aspx?client=1
必须仅显示来自客户端ID#1的请求

因此,我使用
进行查询
“EXEC getRequests@client”

当指定某个客户端时,一切都正常工作。但如果没有,就不要这样做

我使用SSMS测试了我的SP—它在两种情况下都正常工作—指定了参数和未指定参数(
NULL
显式传递)


我该怎么办?

您需要为这些情况下的参数定义一个默认值,例如:

<asp:QueryStringParameter Name="client" QueryStringField="client" DefaultValue="0"/>


然后在SP中,您需要验证客户机是否为0,返回所有客户机,否则返回特定的客户机。

SqlDataSource的任何参数为null时都不会激发,除非您另外指定:

<asp:SqlDataSource CancelSelectOnNullParameter="False" />

可能还需要向querystring参数添加空默认值:

<asp:QueryStringParameter Name="client" QueryStringField="client" DefaultValue="" ConvertEmptyStringToNull="True" />


使用这种方法,您似乎正在向一些相当严重的SQL注入攻击向量敞开大门。@womp:我是如何打开大门的?QueryStringParameter只为具有适当权限的用户添加到代码隐藏中,并且经过多次检查。啊,如果您正在对其进行清理,那就可以了。从您的问题看,它就像您直接使用它一样。@womp:我只获取客户端ID(int)并将其传递给SP。我确信这样做是安全的。我不会做一些愚蠢的事情,比如选择…WHERE ID=“+Request[“client”]:)是否可以将默认值设置为
NULL
DBNull.value
)?嗯,我不这么认为。但是有没有理由使用NULL而不是0、-1或其他什么?对于
NULL
,使用SQL内置函数
ISNULL(,)
很容易。像0或-1这样的值需要额外的
CASE-WHEN-THEN
语句才能使用此url“View.aspx?client=”查询,我认为该参数会自动转换为null,因为它是空的。尝试一下并给出一些反馈,感谢您的参与!:)问题解决了。再见,非常感谢!第一个选项满足我的需要。这是一个非常尴尬的默认值(即默认情况下,它应该使用NULL参数启动)。我很确定表示“一切”的NULL参数非常常见。