选择 ASP.NET 页面中的标题头

5
我创建了一个主页面(Site.master),其中包含显示标题、页脚和侧边栏的代码。它非常好用,但我无法弄清楚如何动态选择标题。
基本上,有两个可能的标题选项。如果用户未登录,我希望他们看到一个登录框和恢复密码等链接。如果他们已登录,他们将看到一个注销链接和一些关于他们账户的信息(实际上与SO类似)。
Site.master是否可以检查并根据用户的登录状态使用我想要的任何标题?我对此很困惑(我认为在主页面的代码后台中进行一些检查),所以任何帮助都将不胜感激。
4个回答

3
您应该考虑使用内置控件LoginViewMSDN),它是专门为认证和匿名用户提供多个模板(视图)而设计的。
这是一种最佳实践方法。您可以为已登录和匿名用户定义标题/页脚等,包括适当的登录/注销按钮、用户信息等等。
以下是一个非常基本的示例:
<asp:LoginView id="LoginView1" runat="server">
    <AnonymousTemplate>
        <asp:HyperLink ID="lnkLogin" runat="server" NavigateUrl="~/Login.aspx" Text="Login"/>
    </AnonymousTemplate>
    <LoggedInTemplate>
        You are logged in as: <asp:LoginName id="lnCurrentUser" runat="server" />.
    </LoggedInTemplate>
</asp:LoginView>

.NET框架将处理其余部分,并在不需要任何额外代码的情况下显示正确的模板。如果您在应用程序中使用多个角色,可以更进一步地为这些角色定义模板(例如管理员与普通用户等)。
基于上述内容,以下是您问题的完美解决方案:如何向匿名用户和登录用户显示不同信息

非常好的答案,谢谢!然而(我继承了这个网站),我猜测网站处理身份验证的方式可能有问题,因为控件似乎总是表明用户已登录。您能否建议我在哪里阅读有关如何在ASP.NET中正确进行站点身份验证的信息?我真的不认为现在做得正确。 - JasCav
很高兴它有帮助。在ASP.NET身份验证方面,两种最常见的内置方式是(1)Windows或(2)表单身份验证。除非您有能力针对Active Directory设置对用户进行身份验证,否则请使用表单身份验证。这是一个描述:http://msdn.microsoft.com/en-us/library/9wff0kyh.aspx。这篇文章也不错,尽管比较老旧:http://www.4guysfromrolla.com/webtech/110701-1.shtml。 - KP.
基本上,在您的web.config中,您指定使用表单身份验证,然后拒绝匿名用户从根文件夹或子文件夹(再次使用web.config)访问。下一步是实现一个非常简单的成员资格提供程序,asp.net将寻找它来登录用户等。上述文章比我更详细地解释了这一点... - KP.

2

非常容易,只需将两个可能的标题放在自己的面板控件中,并在Page_Load中写入以下内容:

if ( Request.IsAuthenticated )
{
    // Display
    pnlAuthenticated.Visible = true;
    pnlGuest.Visible = false;
} 
else 
{
    // Display
    pnlAuthenticated.Visible = false;
    pnlGuest.Visible = true;
}

1
只是一个提醒,使用面板将在子控件周围添加<div>标签,这可能会干扰CSS。在这方面,占位符更加简洁,因为它们只会呈现子控件。但是您的解决方案也可以正常工作。 - Simon Mark Smith
不需要自己编写代码。LoginView 控件通过设计处理此问题,并提供了一种简单的声明性方法。 - KP.

1

个人而言,我会将每组标题控件放入2个不同的占位符中,并默认将两者都设置为不可见

然后,在母版页中使用一些代码

PlaceHolder1.Visible = Context.User.IsAuthenticated
PlaceHolder2.Visible = !Context.User.IsAuthenticated

这样做不行,因为在回发时,用户可能不再被认证,但仍会显示已认证用户的内容。您需要每次按照我的示例隐式处理它。 - Keith Adler
我已经修改了我的示例,使其更加简洁和准确。 - Simon Mark Smith

0

是的,有两种方法可以做到:将标题嵌入面板,根据登录状态显示/隐藏面板(在代码中发生)。或者,您可以使用两个主页面,在OnPreInit方法(或PreInit事件处理程序)中进行此检查,并切换以显示要使用的哪个主页面(您只能在此事件处理程序中以编程方式更改主页面)。

第二个选项的问题是,在PreInit中可能无法使用HttpContext.Current.user...

希望对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接