我有一个带有一些单字符值的下拉列表,以及一个只是带引号,分隔多个值的字符串的值:
<asp:DropDownList ID="ddlStatus" runat="server" style="margin-top: 0px">
<asp:ListItem Value="'I','A','P'">All</asp:ListItem>
<asp:ListItem Value="A">Active</asp:ListItem>
<asp:ListItem Value="I">Inactive</asp:ListItem>
<asp:ListItem Value="P">Prospect</asp:ListItem>
</asp:DropDownList>
我只是想使用ddlStatus.SelectedValue作为我的数据源的参数,这在大多数情况下通过ControlParameter工作:
<asp:ControlParameter ControlID="ddlStatus" DefaultValue=""
name="SearchStatus" PropertyName="SelectedValue" Type="String" Size="12" />
该参数用于T-SQL查询:
... WHERE状态IN(@ SearchStatus)
单个值传递&amp;解析得很好,返回正确的结果。然而,多值字符串显然不是字面上传递的,因为返回的记录总是与字符串中第一个字母的记录匹配,无论我是否以及在何处向值添加引号。 (例如,'I','A','P'的值仅选择status ='I'的记录。)
我的调试显示ddlStatus.SelectedValue确实具有“'I','A','P'”的值,但这似乎不是传递给数据源的内容。
似乎某些额外的翻译或截断是以某种方式发生的?
答案 0 :(得分:0)
一种替代方法是,不是在参数中包含所有状态值,而是可以将null值传递给status参数并使用coalesce函数(假设您正在连接到Sql Server)。如果提供了特定状态,这将匹配特定状态,否则如果该参数的值为null,则只返回状态列等于其自身的所有记录(始终!)。
WHERE Status = COALESCE(@SearchStatus, Status)
关于合并的更多阅读:http://msdn.microsoft.com/en-us/library/ms190349.aspx