昨天我开始编写C#以便为Umbraco开发用户控件,我遇到了一个众所周知的问题,我得到错误“*当前上下文中不存在*名称”。我找到了这个特定问题的无数答案,如:
Fixing "name does not exist in the current context" errors in Web Developer Express
Label doesnt exist in the current context
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(以及我所有的其他LiteralControl - 这只是一个很小的例子)没有自动在* .aspx.design.cs文件中注册,因此,我的* .aspx.cs文件中无法访问它但是,如果我删除标签和标签,我的LiteralControl会弹出。
但是,我需要两个标签来使代码功能正常,所以我的问题仍未解决:我该怎么办?这是一个错误吗?
提前致谢, Brinck10
答案 0 :(得分: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";
}