如何在C#中使用全局变量

时间:2014-04-28 02:04:28

标签: c# asp.net global-variables

这是我的代码

public partial class Books : System.Web.UI.Page
{
    String Book_CategoryName = "";
    String Book_SubCategoryName = "";

   protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Book_CategoryName = "Education";
        }
    }
    public void BookDataLinkButton_Click(object sender, EventArgs e)
    {
        Response.Write("Data Found :: "+Book_CategoryName);
    }

}

在这段代码中我使用全局变量,在page_load上设置Book_CategoryName变量的值并尝试单击LinkBut​​ton。但我无法获得“教育”。当我运行此代码时,它会显示 Data Found ::

如何获取Book_CategoryName变量的值。

尽量帮助我摆脱这个问题。

3 个答案:

答案 0 :(得分:2)

在每个帖子上,重新创建页面(书籍)的实例,因此在按钮单击后您将无法获得Book_CategoryName的值。 approch是将变量存储在ViewState中。

private const string KEY_Book_CategoryName = "Book_CategoryName";
public String Book_CategoryName
{
    get
    {
        return ViewState[KEY_Book_CategoryName] as string;
    }
    set
    {
        ViewState[KEY_Book_CategoryName] = value;
    }
}

另一个approch可以将值存储在页面的隐藏字段中。我们的想法是将值存储在回发期间可以持久存在的地方。

答案 1 :(得分:1)

这是因为每个Web请求调用的页面对象不同。因此,当您在Page_Load中初始化Book_CategoryName时,它仅对该请求有效,并且该值在下一个请求中丢失,即调用BookDataLinkBut​​ton_Click时。

在您的情况下,您可以在声明期间简单地初始化变量,如下所示:

String Book_CategoryName = "Education";

您可以查看this question了解详情。

或者,您可以使用ViewState代替"全局变量"

protected void Page_Load(object sender, EventArgs e)
{
     if (!Page.IsPostBack)
     {
         ViewState["Book_CategoryName"] = "Education";
     }
}

public void BookDataLinkButton_Click(object sender, EventArgs e)
{
     Response.Write("Data Found :: " + (string)ViewState["Book_CategoryName"]);
}

答案 2 :(得分:0)

更改您的变量,如下所示

static String Book_CategoryName = "";    
static String Book_SubCategoryName = "";