如何将字段选作SqlDataSource的筛选参数?
解决SqlDataSource FilterExpression动态选择字段不生效的问题
兄弟,问题根源一眼就能看出来——你把FilterExpression里的字段名参数{0}用单引号包起来了!
咱们理一理:当你写'{0}'的时候,SQL会把这个参数当成普通的字符串字面量来处理,比如你选了"start_date",它就会变成比较'start_date' >= '你的输入日期'——这完全是拿字符串和日期值做对比,根本不会去读取表的start_date字段内容,筛选自然失效。而你直接写start_date的时候,SQL能正确识别这是表的字段名,所以能正常工作。
直接修改FilterExpression就能解决问题
把原来带单引号的FilterExpression改成下面这样,去掉{0}两边的单引号:
<asp:SqlDataSource ID="Gridview_SqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:databaseConnectionString %>" SelectCommand="SELECT * FROM table" FilterExpression= "{0} >= '{1}' AND {0} <= '{2}'"> <FilterParameters> <asp:ControlParameter ControlID="Date_Type_DropDownList" Name="DateType" PropertyName="SelectedValue" Type="String" /> <asp:ControlParameter ControlID="date_start_textbox" PropertyName="Text" DefaultValue="01/01/1900"/> <asp:ControlParameter ControlID="date_end_textbox" PropertyName="Text" DefaultValue="31/12/3000" /> </FilterParameters> </asp:SqlDataSource>
额外几个要注意的细节
- 你的DropDownList已经设置了
AutoPostBack="True",这点很关键,确保选择选项后页面会回发更新筛选结果,不用额外调整。 - 日期格式要和数据库匹配!如果数据库里的日期是
yyyy-MM-dd格式,而你文本框输入的是dd/MM/yyyy,很可能会出现日期转换错误。建议把日期参数的Type改成DateTime,让ASP.NET自动处理格式转换:<asp:ControlParameter ControlID="date_start_textbox" PropertyName="Text" DefaultValue="1900-01-01" Type="DateTime"/> <asp:ControlParameter ControlID="date_end_textbox" PropertyName="Text" DefaultValue="3000-12-31" Type="DateTime" /> - 处理下拉框的默认选项:如果用户没选任何日期类型(也就是选中"Choose..."),可以在后台代码里判断
Date_Type_DropDownList.SelectedValue == "-1",然后清空FilterExpression或者设置默认的筛选逻辑,避免出现无效字段名导致的错误。
内容的提问来源于stack exchange,提问作者Teoh Lee Sheng
相关产品推荐
相关产品推荐

