Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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# web应用程序中的类作用域_C#_Asp.net_Class_Datatable_Scope - Fatal编程技术网

C# web应用程序中的类作用域

C# web应用程序中的类作用域,c#,asp.net,class,datatable,scope,C#,Asp.net,Class,Datatable,Scope,我有一个关于我创建的与web应用程序相关的类的范围的问题。 我的类是CCourseInfo,我创建它作为我的一个注册网页的私人成员。 在Page_Load方法中,有一个数据库调用来加载类成员DataTable中的表数据。此数据表绑定到gridview。 代码如下: public partial class Enrollment : System.Web.UI.Page { private Course CCourseInfo = new Course("Courses"); prot

我有一个关于我创建的与web应用程序相关的类的范围的问题。 我的类是CCourseInfo,我创建它作为我的一个注册网页的私人成员。 在Page_Load方法中,有一个数据库调用来加载类成员DataTable中的表数据。此数据表绑定到gridview。 代码如下:

 public partial class Enrollment : System.Web.UI.Page
{
   private Course CCourseInfo = new Course("Courses");
  protected void Page_Load(object sender, EventArgs e)
    {          
        try
        {
            if (!IsPostBack)
            {
                //Get the Environment Setting to determine the database to access
                txtBoxEnvironment.Text = CurrentEnvironment;
                DAL.setCurrentEnvironment(CurrentEnvironment);

                //Get Course information from database
                CCourseInfo.getData();
                 CourseGridView.DataSource = CCourseInfo.TableInfo;
                CourseGridView.DataBind();

            }
       }
}
我想实现分页。 此方法有效,但我必须再次获取数据以填充CCourseInfo类中的DataTable

  protected void CourseGridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        CourseGridView.PageIndex = e.NewPageIndex;
        CCourseInfo.getData();
        CourseGridView.DataSource = CCourseInfo.TableInfo;
        CourseGridView.DataBind();
    }
我的问题是:为什么我必须再次获取数据?我在Page_Load方法中设置了DataTable,并在Enrollment类下声明了类。数据表中不应该仍然存在数据吗?我怎样才能改变我的设计,使我只需要获得一次数据


谢谢,

您必须再次获取数据,因为ASP.NET(以及通常的网页)是无状态对象-这意味着每次执行页面后,页面都会被清理,其所有状态都会被删除。当一个新的请求进入同一个页面时,您必须重新创建它的所有部分——同一个页面类将再次被实例化,并且您将从头到尾再次经历页面生命周期

如果您不熟悉页面的生命周期,这里有一个非常详细的示例-这将帮助您更好地了解请求过程中发生的事情

有一些事情你可以尝试(不是详尽的列表):

  • 在缓存服务器或会话状态中缓存数据库中的所有记录。如果您有很多记录,这可能会占用大量内存(对于每个用户),因为所有页面都是一次加载的-您不会每次都访问数据库来查询数据。缓存会大大加快速度,但您可能会向用户显示过时的数据—其他用户可能会更改数据。正确处理缓存数据(何时删除、何时获取新副本等)也相当棘手

  • 您只能查询单个页面的记录-这会降低web服务器和数据库之间的数据流量。您还必须在每次页面更改时查询数据,因为您没有超过当前页面的数据

  • 您可以查询所有数据,然后将其发送到客户端,并在浏览器中执行所有分页。这会产生大量流量,因为无论用户是否想查看页面,都必须将所有页面发送到客户端。这种方式分页速度要快得多,但浏览器会占用大量内存,将数据传送到客户端可能需要很长时间,具体取决于网络速度


最好的解决方案是获取尽可能少的数据(网格中的一个页面)-如果必须重新查询,数据库将根据需要向您发送尽可能少的数据。

首先确定,因为Web使用的是HTTP,这是一种无状态协议,所以您会丢失网页的状态。 因此,你必须自己管理自己的状态。有许多方法可以用来管理状态

下面是我如何解决这个问题的:我保存了从数据库收到的数据,并将整个列表存储在视图状态。每次有回帖时,我都会从视图状态检索数据

            if (!Page.IsPostBack)
        {
            ViewState["data"] = MyDataset;
            DataListView.DataSource = ViewState["data"];
            DataListView.DataBind();
        }

        if (Page.IsPostBack)
        {
            DataListView.DataSource = ViewState["data"];
            DataListView.DataBind();
        }

您还可以使用会话状态和其他一些状态管理技术。

您能告诉我们如何使用您的类吗?因为当页面重新加载时,所有内容都需要重新加载。这就是internet/web应用程序的工作方式,因为它不同于桌面应用程序。每次重新加载都是对服务器的新请求,而之前的请求“就好像”不存在。现在它有意义了。通常,我不喜欢对数据库进行如此多的调用。一个表最多只能有几百条记录。我应该继续对数据库进行这些调用,还是有更好的方法来填充DataTable并为站点使用这些数据?我建议使用“正确的方法”,只编写代码,根据需要从数据库中提取必要的数据(可能还可以使用Couchbase等缓存解决方案)。这将帮助您了解如何构造任意大小的web应用程序。在一个小的应用程序中,您可以一次性提取数据,但它不会在更大的范围内运行。