Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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_Vb.net - Fatal编程技术网

C# Web用户控件中的访问类变量

C# Web用户控件中的访问类变量,c#,asp.net,vb.net,C#,Asp.net,Vb.net,我有一个类,它有一个属性和大约6个公共方法(没有什么是静态/共享的) 我的aspx页面将Class属性设置为某个值,一旦设置了该值,我就可以访问aspxPage中的类方法,现在一切正常。在我的aspx页面中有3个web用户控件,我需要访问这些web用户控件中的一些类方法,我不想在每个用户控件中创建类的新实例 例如,url的类别代码为25,当25传递给类时,类有不同的方法来创建面包屑、SEO友好的url等…并且不同的页面用户控件正在执行不同的任务,例如Class.CreateMenu、Class.

我有一个类,它有一个属性和大约6个公共方法(没有什么是静态/共享的)

我的aspx页面将Class属性设置为某个值,一旦设置了该值,我就可以访问aspxPage中的类方法,现在一切正常。在我的aspx页面中有3个web用户控件,我需要访问这些web用户控件中的一些类方法,我不想在每个用户控件中创建类的新实例

例如,url的类别代码为25,当25传递给类时,类有不同的方法来创建面包屑、SEO友好的url等…并且不同的页面用户控件正在执行不同的任务,例如Class.CreateMenu、Class.PageTitle等


那么,在我的aspx页面中插入类并让我的web用户控件访问其成员的最佳方式是什么呢?

您必须在
page\u Init
page\u Load
方法中实例化该类,并将其保存到
Session
ViewState
以便
用户可以使用此引用控件

Session["myObj"]=new MyClass();
并读取
bounded
对象

if(Session["myObj"]!=null){
 MyClass obj=Session["myObj"] as MyClass;
 if(obj!=null){

 }
}
或者向每个用户控件添加公共属性/方法

public MyClass Data {get;set;}
protected void Page_Load(object sender, EventArgs e)
{
 if(Data!=null)
  Label1.Text = Data.Foo;
}
并从页面事件处理程序中分配对象引用(页面加载)


如果可能的话,我会处理这个问题,在.ascx用户控件中编写处理类的方法,然后调用该方法,从aspx页面将类传递给该方法

在类在aspx页面中实际设置之前,首先呈现控件,因此您唯一的其他选项是将类变量另存为会话、cookie或隐藏字段,如另一个答案所示

在aspx中,创建用户控件的新实例

   <asp:PaymentInformation ID="PaymentInformation1" runat="server" />

在webusercontroll中全局声明如下

public int varriable1{ get; set; }

public int varriable2{ get; set; }

在webusercontroll中,分别将variable1和variable2访问到变量1和变量2中

int a=variable1;
int b=variable2;
在yourpage.aspx中将变量传递到webusercontroll中

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        PostComments_global1.varriable1= 6; //PostComments_global1 is your webuseruser controll id
        PostComments_global1.varriable2= 6;
    }
}

有没有可能不用SESSION/VIEWSTATE来完成?这将给web服务器带来额外的压力。在经典Asp中,这非常简单…我们过去常常在页面顶部声明变量,并且所有包含文件都可以在整个页面中访问它。如果我的用户控件位于母版页的内容页内,那么我应该怎么做。我想我可以将一些公共属性公开给用户控制(如上所述),然后在母版页上访问它们?或者在用户控件中有一个隐藏字段,然后在母版页中访问它。如果母版页在内容页中,它可以访问用户控件的属性吗?是因为我的类/页设计有问题吗?或者这是与页面和控件共享值的唯一方法。我不确定您到底想做什么,您可以设置类值,但必须将它们存储在某个位置,否则在刷新页面时,它们将从服务器丢失,因为控件首先呈现,当您在aspx中设置类时,控件已经完成了它的代码,因此在调用aspx控件时,您必须已经设置了变量
int a=variable1;
int b=variable2;
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        PostComments_global1.varriable1= 6; //PostComments_global1 is your webuseruser controll id
        PostComments_global1.varriable2= 6;
    }
}