无法找到父母版页的超链接

时间:2013-12-02 07:36:06

标签: c# asp.net security web

此母版页的层次结构

|--main.master
   |-- index.aspx
   |-- user.master
       |-- login.aspx

表示user.master的母版页为main.master,登录页的母版页为user.master

我在main.master页面上有一个loginview控件。

loginview代码;

<asp:LoginView ID="HeadLoginView" runat="server" EnableViewState="false">
   <AnonymousTemplate>
      [ <a href="~/PageCommon/login.aspx" id="HeadLoginStatus" runat="server" color="#87cfe6">Log In</a> ]
   </AnonymousTemplate>
   <LoggedInTemplate>
      Welcome <span class="bold">
      <asp:HyperLink ID="HyperLink1" ForeColor="PeachPuff" Font-Size="Larger" ToolTip="MyHome"  runat="server"> <asp:LoginName ID="HeadLoginName" runat="server" /></asp:HyperLink>
      </span>&nbsp;&nbsp;
      [
       <asp:LoginStatus ID="HeadLoginStatus" ForeColor="#87cfe6" runat="server" LogoutAction="Redirect" LogoutText="Log Out" LogoutPageUrl="~/PageCommon/index.aspx" />
      ]
   </LoggedInTemplate>
</asp:LoginView>

现在在登录页面的代码后面我想访问登录视图的超链接来更改该超链接的导航URL。但我无法访问超链接。

我使用此代码访问超链接

if (User.Identity.IsAuthenticated)
{
   HyperLink rdirect = (HyperLink)Master.FindControl("HyperLink1");

   int index = utype.SelectedIndex;

   if (index == 0)
   {
      rdirect.NavigateUrl = ResolveUrl("~/PageUser/MyProfile.aspx");
   }
   else if (index == 1)
   {
      rdirect.NavigateUrl = ResolveUrl("~/PageAdmin/MyProfile.aspx");
   }
}

登录页面的母版页为user.masteruser.master的母版页为main.master

2 个答案:

答案 0 :(得分:1)

首先要访问母版页中的任何控件(在ContentPlaceHolder中),一种方法是,首先访问ContentPlaceHolder,而不是在这个CPH(ContentPlaceHolder)中找到你想要的控件。(如果它在root上,即outsede CPH比访问它没有找到CPH)

如果LoginView位于Main.master的根目录,则为

 LoginView logInView = (LoginView)this.Master.Master.FindControl("HeadLoginView");
 HyperLink hyp2 = (HyperLink)logInView.FindControl("HyperLink1");

在Main.master的ContentPlaceHolder中使用LoginView的情况:

在您的方案中,您有嵌套的母版页...如果您这样定义: 假设你在main.master他们只有一个ContentPlaceHolder Id = ContentPlaceHolder1

ContentPlaceHolder User_cph1 = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1"); 

它将为您提供User.master ContentPlaceHolder,因为它们只是母版页中的一个CPH(其假设)

所以一种方法是在main.master中定义新的contentplaceholde(“ContentPlaceHolder2”)并在其中加入LoginView Control,而不是使用此代码:(定义新CPH的目的只是为了验证此CPH未被使用user.master)

ContentPlaceHolder Main_cph2 = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder2");
        LoginView logInView = (LoginView)Main_cph2.FindControl("HeadLoginView");
        HyperLink hyp2 = (HyperLink)logInView.FindControl("HyperLink1");

首先会在Main.Master中找到CPH

比在CPH中查找HeadLoginView

在HeadLoginView中找到HyperLink

希望对你有所帮助:)

答案 1 :(得分:0)

这是因为您尝试访问母版页母版页的控件。

此:

(HyperLink)Master.FindControl("HyperLink1");

不起作用,因为您尝试从母版页获取控件,但控件位于母版页的母版页中。我认为你应该在user.master的代码隐藏中有一个属性,它返回这个控件,你应该在login.aspx的代码隐藏中使用该属性。