3

baslik.aspxページがあり、masterpageを使用しています。同じライブラリのWorker.csファイルを作成し、Worker.csからbaslik.aspxリテラルオブジェクトにアクセスしたいと思います。nullオブジェクト参照と表示されます。

私の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の時代には、物事はもっと単純でした。この回答が述べているように、コントロールは、WindowsフォームコントロールがInitializeComponentでインスタンス化されるのと同様の方法で、明確に定義された場所に作成されていました。

.Net2.0の時代はそれをすべて変えました。このボイラープレートコードをすべて用意する必要はなくなりました。代わりに、フレームワークは、page.designerで宣言されたコントロールに基づいて、最初の実行時(または、サイトがプリコンパイルされる前)に必要なすべての配線を生成します。 csファイル。

残念ながら、その後、標準のASPXページから継承すると、子のchild.designer.csファイルで宣言されたコントロールのみが自動的に作成されます。親プロパティは親コントロールで使用でき、自動的に初期化されることはありません(リンクされた回答が推奨するように、生成されたコードを見ると非常にわかりやすくなります)。

代わりに、ベースページをスタンドアロンクラスにカプセル化することは非常に一般的です。このクラスは、必要なコントロールをプログラムで構築します。たとえば、ページライフサイクルの早い段階(Page_Initなど)で呼び出される基本クラスのCreateControlsMethodまたは同様のものです。ただし、ベースコントロールツリー全体を作成するのは非常に面倒で、レイアウトの変更が困難になるため(ページ全体を効果的に作成する必要があるため、ほとんど保守不可能なため) 、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

1つのアプローチは、次の保護されたプロパティまたはパブリックプロパティを介してこのファイルを公開することですBaslik.cs

public Literal myPublicBaslikLiteral { get { return myBaslikLiteral; } }

次に、Worker.cs次のようにこのプロパティを使用できます。

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