3

我有 baslik.aspx 页面,它使用母版页。我创建了一个 Worker.cs 文件相同的库,我想从 Worker.cs 访问 baslik.aspx 文字对象。它说空对象引用!

我的 baslik.aspx:

<%@ Page Async="true" EnableEventValidation="true" Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Baslik.aspx.cs" Inherits="F8.Imza.Baslik" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
..
..
<asp:Literal runat="server" id="myBaslikLiteral">
..
</asp:Content>

baslik.aspx.cs :

namespace F8.Imza
{
    public partial class Baslik : System.Web.UI.Page
    {
      ...
      ...
      ...
    } 
}

我想从 Worker.cs 访问页面(运行)上的任何对象:所以我尝试...:

public partial class Worker : Baslik
{
   public void ActionStart()
    { 
       this.myBaslikLiteral.Text = "Bla bla bla";
       //i can see my literal name but it is null.
    }
}
4

3 回答 3

2

在 .Net 1.1 天,事情变得更简单了;正如这个答案所提到的,控件过去是在定义明确的地方创建的,其方式类似于在 InitializeComponent 中实例化 Windows 窗体控件的方式。

.Net 2.0 时代改变了这一切;不再需要所有这些样板代码 - 相反,框架将根据 page.designer 中声明的控件在第一次运行时(或在站点预编译之前)生成所有必要的接线。 cs 文件。

不幸的是,当您从标准 ASPX 页面继承时,只会自动创建在 childs child.designer.cs 文件中声明的控件;父属性在父控件上可用,它们只是永远不会自动初始化(正如链接的答案所建议的那样,查看生成的代码非常有启发性)。

相反,人们将他们的基本页面封装在一个独立的类中是很常见的。此类以编程方式构建必要的控件,例如,在基类中的 CreateControlsMethod 或类似中,在页面生命周期的早期调用(如 Page_Init)。但是,还要注意有多少人只是将通用页面功能放在 BasePage 中(请参见此处的典型示例),因为创建整个基本控件树非常繁琐,并且使更改布局变得困难(几乎无法维护,因为您必须有效地创建整个页面在后面的代码中)。

但是,在页面中封装功能区域(如常见表单字段)的更简单方法是创建UserControls

于 2012-06-08T23:09:58.207 回答
0

不完全确定我是否理解这个问题,但如果你尝试:

this.FindControl("myBaslikLiteral").Text = "Bla bla bla";

如果这不起作用,您可能必须枚举页面上的控件,然后找到子控件。

于 2012-06-08T21:35:09.090 回答
0

我认为这myBaslikLiteral是由设计师从内部生成的私有字段Baslik.aspx

一种方法是通过以下受保护或公共财产公开此文件Baslik.cs

public Literal myPublicBaslikLiteral { get { return myBaslikLiteral; } }

然后Worker.cs你可以使用这个属性,如:

this.myPublicBaslikLiteral.Text = "Bla bla bla";
于 2012-06-08T21:35:33.693 回答