0

昨日、Umbraco のユーザー コントロールを開発するために C# を書き始めたところ、「現在のコンテキストに * 名が存在しません」というエラーが発生するというよく知られた問題に遭遇しました。次のように、その特定の問題に対する無数の答えを見つけました。

Web Developer Express の「現在のコンテキストに名前が存在しません」というエラーを修正する

ラベルは現在のコンテキストに存在しません

http://forums.asp.net/t/1006588.aspx/1?The+name+xxx+Does+Not+Exist+in+the+Current+Context

...などなど。

しかし、これらの質問はどれも私の問題を解決するのに役立ちませんでした。私はまだ頭を壁にぶつけています。

その後、タグとそのコントロールが *.apsx.cs ファイルによって検出されることを発見しました

カスタム テンプレートを使用してカスタム ログイン コントロールを作成しようとしています。そのためには -tag が必要です。さらに、これを LoginView コントロール内に配置します。

<asp:LoginView ID="MemberValidation" runat="server"> 
   <AnonymousTemplate>
     <asp:Login ID="MemberLogin" runat="server" OnLoggedIn="MemberLogin_OnLoggedIn">
        <LayoutTemplate>
           <asp:Literal ID="InformationMessage" runat="server"></asp:Literal>
        </LayoutTemplate>
   </AnonymousTemplate>
   <LoggedInTemplate>...</LoggedInTemplate>
</asp:LoginView>

私の LiteralControl (および私が持っている他のすべての LiteralControls - これはほんの一例です) は *.aspx.design.cs ファイル内に自動的に登録されないため、*.aspx.cs ファイルではアクセスできませんが、タグとタグを削除すると、LiteralControl がポップアップします。

ただし、コードを希望どおりに機能させるには 2 つのタグが必要なので、私の疑問は未解決のままです。バグですか?

Brinkk10 さん、よろしくお願いします。

4

1 に答える 1

1

あなたの問題を正しく理解している場合、AnonymousTemplateまたはLayoutTemplateタグ内に配置されている限り、.cs からリテラル コントロールに直接アクセスすることはできません。

それが正しい場合、それはこれらのタグ内のすべてが (ご想像のとおり) テンプレートであり、実際のランタイム インスタンスを表していないためです。また、コンパイラはこれらのテンプレートが表示されることを保証できません (たとえば、ユーザーがログインしているためLoggedInTemplate、代わりに表示されます)、したがって、これらのコントロールを .cs に自動的に公開しません。

実際、.cs に即座に表示されるのはLoginViewコントロールだけです。したがって、テンプレート内のコントロールにアクセスするには、実行時に次のようなコードを使用してそれらを「検索」する必要があります。

if (!User.Identity.IsAuthenticated)
{
    Login memberLogin = (Login)this.MemberValidation.FindControl("MemberLogin");
    Literal informationMessage = (Literal)memberLogin.FindControl("InformationMessage");
    informationMessage.Text = "Hello World";
}
于 2012-07-03T09:41:03.687 に答える