【问题标题】:Class scope in a web applicationWeb 应用程序中的类范围
【发布时间】:2014-06-18 03:17:36
【问题描述】:

我有一个关于我创建的与 Web 应用程序相关的类的范围的问题。 我的课程是 CCourseInfo,我将其创建为我的一个网页注册的私人成员。 在 Page_Load 方法中,有一个数据库调用来加载类成员 DataTable 中的表数据。此 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 类下声明了该类。数据不应该仍然存在于 DataTable 中吗?如何更改我的设计以便我只需获取一次数据?

谢谢,

【问题讨论】:

  • 你的课怎么样?
  • 因为页面重新加载的时候,所有的东西都需要重新加载。这就是 Internet/Web 应用程序的工作方式,因为它不同于桌面应用程序。每次重新加载都是对服务器的新请求,而之前的请求“好像”不存在

标签: c# asp.net class datatable scope


【解决方案1】:

首先,因为 Web 使用的是 HTTP,它是一种无状态协议,所以这就是您丢失网页状态的原因。 所以你必须自己管理状态。您可以使用多种方式来管理状态。

这是我解决这个问题的方法,我保存了从数据库接收到的数据,并将整个列表存储在视图状态中。每次有回发时,我都会从视图状态中检索数据。

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

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

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

【讨论】:

    【解决方案2】:

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

    如果您不熟悉页面生命周期,这里有一个 SO question / answers,其中包含相当多的详细信息 - 这将帮助您更好地了解请求期间发生的情况。

    您可以尝试一些事情(并非详尽的清单):

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

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

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

    最好的解决方案是尽可能少地获取数据(网格一页) - 如果您必须重新查询它,数据库将尽可能少地发送给您。

    【讨论】:

    • 好的。现在它是有道理的。通常,我不喜欢对数据库进行如此多的调用。一张表最多有几百条记录。我应该继续对数据库进行这些调用,还是有更好的方法来填充 DataTable 并将该数据用于站点?
    • 我建议以“正确的方式”进行操作,只需编写代码以根据需要仅从数据库中提取必要的数据(并且可能使用 Couchbase 等缓存解决方案等)。这将帮助您学习如何构建任意大小的 Web 应用程序。您也许可以在小型应用程序中一次提取数据而侥幸成功,但它不会在更大规模的应用程序中飞速发展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多