Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否筛选ASP.NET ObjectDataSource?_C#_Asp.net_Filter_Webforms_Objectdatasource - Fatal编程技术网

C# 是否筛选ASP.NET ObjectDataSource?

C# 是否筛选ASP.NET ObjectDataSource?,c#,asp.net,filter,webforms,objectdatasource,C#,Asp.net,Filter,Webforms,Objectdatasource,我在标准ASP.NET WebForm中有一个ObjectDataSource,它只需加载用户正在查看的页面所需的数据,就可以进行有效的分页。我现在想过滤特定列的结果(比如说客户列),你会怎么做 <asp:ObjectDataSource ID="ticketsDataSource" runat="server" SelectMethod="GetTicketsData" EnablePaging="true" MaximumRowsParameterNam

我在标准ASP.NET WebForm中有一个ObjectDataSource,它只需加载用户正在查看的页面所需的数据,就可以进行有效的分页。我现在想过滤特定列的结果(比如说客户列),你会怎么做

<asp:ObjectDataSource ID="ticketsDataSource" runat="server"
        SelectMethod="GetTicketsData" EnablePaging="true"
        MaximumRowsParameterName="pageSize"
        StartRowIndexParameterName="startRowIndex"
        TypeName="SupportSystem.App_Code.TicketsDataSource" SelectCountMethod="TotalRowCount">
        <SelectParameters>
            <asp:Parameter Name="startRowIndex" Type="Int32" />
            <asp:Parameter Name="pageSize" Type="Int32" />
        </SelectParameters>
</asp:ObjectDataSource>

我以前在代码隐藏中做的一切如下所示,但这意味着一旦添加了大量票据,网格在分页等时会非常慢,因为它在渲染等之前加载所有数据

DataSet ds = new DataSet();
Dictionary<string, object> d = new Dictionary<string, object>();
d.Add("@params", "");
ds.ReadXml(new System.IO.StringReader(Database.DAL_XML("Usp_Fetch_Tickets", d).OuterXml));
if (Database_error(ds))
{
   return;
}
var dv = ds.Tables[0].DefaultView;
dv.RowFilter = "Customer LIKE '%abc%'";
var newDS = new DataSet();
var newDT = dv.ToTable();
newDS.Tables.Add(newDT);
gvTickets.DataSource = newDS;
gvTickets.DataBind();
DataSet ds=新数据集();
字典d=新字典();
d、 添加(“@params”,”);
ReadXml(newsystem.IO.StringReader(Database.DAL_XML(“Usp_Fetch_Tickets”,d.OuterXml));
如果(数据库错误(ds))
{
返回;
}
var dv=ds.Tables[0].DefaultView;
dv.RowFilter=“像“%abc%”这样的客户”;
var newDS=新数据集();
var newDT=dv.ToTable();
newDS.Tables.Add(newDT);
gvTickets.DataSource=newDS;
gvTickets.DataBind();

关于如何有效过滤ObjectDataSource有什么想法吗?

您可以使用标记中的
FilterParameters
属性,然后指定
参数
子类之一。例如,假设您有一个
文本框
,供用户输入客户名称以按该客户筛选结果,您将需要为此使用
控制参数

<asp:ObjectDataSource>
      <FilterParameters>
          <asp:ControlParameter ControlID="txtCustomer" PropertyName="Text" Name="customerName" />
      </FilterParameters>
</asp:ObjectDataSource>


此处
txtCustomer
将是
文本框的ID
Text
是该控件的属性,用于从中获取输入值,
customerName
GetTicketsData
方法中的一个参数,您需要公开该参数才能传入筛选值

可以使用
filtereexpression
。下面是如何实现这一点的示例代码段

<asp:objectdatasource
          id="ObjectDataSource1"
          runat="server"
          selectmethod="GetAllEmployeesAsDataSet"
          typename="Samples.AspNet.CS.EmployeeLogic"
          filterexpression="FullName='{0}'" OnFiltering="ObjectDataSource1_Filtering">
            <filterparameters>
              <asp:formparameter name="FullName" formfield="Textbox1" defaultvalue="Nancy Davolio" />
            </filterparameters>
        </asp:objectdatasource>

谢谢,这看起来很棒,如果我想要多个过滤器,我可以使用{1}{2}等,并指定更多的asp:formparameter?是的,你是对的。如果这有助于您将其标记为已回答。幸运的是,这不是Sql注入的主题吗?是否有一种方法可以使用安全参数(使用@myparam…)进行用户筛选?