从ashx页面查询数据表



我想用Page_Load事件填充DataTable,然后能够在从客户端发送Ajax调用时从ashx处理程序页面访问它。目前,每次对处理程序页面进行Ajax调用时都会填充DataTable,这使得它有点慢。以下是我目前的做法:

Default.aspx.cs

public DataTable fillSCOMDTts()
    {
        //SCOM TableAdapter and DataTable
        dsCIInfoTableAdapters.vManagedEntityTableAdapter taSCOM;
        taSCOM = new dsCIInfoTableAdapters.vManagedEntityTableAdapter();
        dsCIInfo.vManagedEntityDataTable dtSCOM = new dsCIInfo.vManagedEntityDataTable();
        taSCOM.Fill(dtSCOM);
        return dtSCOM;
    }

客户端Ajax调用:

$.ajax({
    url: '/FindFootprint.ashx?queryStr=' + strParameter,
    dataType: 'json',
    success: function (data) {
              //do stuff
});

FindFootprint.ashx.cs

public void ProcessRequest(HttpContext context)
    {
        string strParameter = context.Request.QueryString["queryStr"];
        bool binSCOMts = false;
        Default d = new Default();
        DataTable dtSCOMts = d.fillSCOMDTts();
        var qstSCOMts = (from row in dtSCOMts.AsEnumerable()
                       let fieldName = row.Field<string>("DisplayName")
                       where fieldName.ToLower().Contains(strParameter)
                       select fieldName).ToArray();
        if (qstSCOMts.Length > 0)
        {
            binSCOMts = true;
        }
        JsonObject JO = new JsonObject();
        JO.Add("assetName", strParameter);
        JO.Add("inSCOMts", binSCOMts.ToString());
        context.Response.ContentType = "text/plain"; 
        context.Response.Write(JO.ToString());
    }

处理程序实际上不应该知道自身之外的任何代码/对象。

如果你不能在这种情况下使用处理程序,那么你可以在你的页面中设置一个private static DataTable MyTable;

然后在page_load上填充这个静态属性。

你应该可以在Ajax调用的web方法中访问这个属性。web方法将是你的页面代码的一部分,所以将有访问上述私有属性集。将处理程序中的代码放到这个web方法中,而不是绑定。