我为自己制作的 Web 应用程序做了类似的事情。您可以利用 asp:SqlDatasource 的 OnSelecting 事件(我建议使用它而不是在代码隐藏中动态构建选择命令)来动态调整选择命令的参数。
我不确定这是否是这样做的最佳方式,但它确实有效。
我的标记看起来像这样(简化的 GridView 标记):
<asp:SqlDataSource ID="SelectItemsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:hubConnectionString %>"
ProviderName="<%$ ConnectionStrings:hubConnectionString.ProviderName %>"
SelectCommand="SELECT itemEntity.id, itemEntity.name, itemEntity.filename, itemEntity.type, itemEntity.added, userEntity.name FROM item AS itemEntity
LEFT OUTER JOIN USER AS userEntity ON itemEntity.uploader = userEntity.id WHERE itemEntity.type like @type ORDER BY itemEntity.added DESC"
OnSelecting="onItemSelecting">
<SelectParameters>
<asp:Parameter Name="@type" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
<asp:GridView ID="ItemGrid" runat="server" DataSourceID="SelectItemsDataSource"/> // Simplified
注意 OnSelecting 属性。
然后在代码隐藏中,您可以简单地处理 OnSelecting 事件:
protected void onItemSelecting(object sender, SqlDataSourceSelectingEventArgs e)
{
// Type value NOT given and parameter exists - Set wildcard
if (Request.QueryString["type"] == null && e.Command.Parameters.Contains("@type"))
{
e.Command.Parameters["@type"].Value = "%";
return;
}
if (Request.QueryString["type"] != null && e.Command.Parameters.Contains("@type"))
e.Command.Parameters["@type"].Value = Request.QueryString["type"];
}
我相信 Command.Parameters 方法是 sql 注入安全的。如果不是那么有人请纠正我。