0

昨天我开始编写 C# 以便为 Umbraco 开发用户控件,我遇到了一个众所周知的问题,我收到错误“当前上下文中不存在 * 名称”。我找到了针对该特定问题的无数答案,例如:

修复 Web Developer Express 中的“名称在当前上下文中不存在”错误

当前上下文中不存在标签

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

...等等等等。

然而,这些问题都没有帮助我解决我的问题,我仍然把头撞在墙上。

然后我发现我的标签及其控件会被我的 *.apsx.cs 文件发现,只要我不将它们放在任何非 asp:-tag 中!

我正在尝试使用自定义模板制作自定义登录控件,因为我需要 -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 弹出。

但是,我需要这两个标签才能使代码按我的意愿运行,所以我的问题仍未解决:我能做什么?它是一个错误吗?

提前致谢, Brinck10

4

1 回答 1

1

如果我正确理解了您的问题,则 .cs 不能直接访问 Literal 控件,只要它放在AnonymousTemplateorLayoutTemplate标记内即可。

如果这是正确的,那是因为这些标签中的任何东西都是(正如你已经猜到的那样)模板并且不代表实际的运行时实例,并且编译器不能保证这些模板将被显示(例如用户已登录,所以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 回答