向可能看到不同母版页的不同用户显示相同的内容(ASP.net)

时间:2010-07-19 15:27:48

标签: asp.net authentication master-pages

我有一些页面的内容与登录用户和未登录用户都相关。例如,包含联系信息,隐私政策等的页面。所有页面都有您的典型导航菜单,但登录的用户通常会看到与未登录用户不同的导航菜单栏。

在ASP.net中执行此操作的最佳方法是什么?

到目前为止,可能的解决方案包括以下内容:

  1. 使用弹出窗口显示内容。该页面将不包含任何菜单,只是一些基本页面不需要检查用户正在看到它的类型。
  2. 根据用户是否经过身份验证,以编程方式更改母版页。但是,其中一个母版页上有一些变量需要访问,但未登录的用户根本不会触及。
  3. 将内容放在用户控件中,并将此用户控件放在两个单独的页面上,以显示给相应的用户。
  4. 我不是#1的粉丝,因为第一次访问该网站的用户可能有某种类型的弹出窗口拦截器或禁用了javascript。

    我知道#2可以通过让页面使用从MasterPage继承的某种类型的基类来实现。但是,我读过这可能不是最好的设计,因为现在其中一个页面可以访问非必要的变量。

    第三种方法听起来很合理,但之后会有两个单独的ASPX文件。

    有没有正确的方法呢?还是我还没想到的另一种方法呢?

    修改

    为了澄清,登录用户需要在未登录用户的主页中设置某些变量。原因是有一个用户控件显示一个特殊的导航菜单,根据这些变量突出显示某些项目。

    例如,用户控件需要一个字符串来确定要突出显示的项目。包含个人资料信息的页面将提供“个人资料”作为参数,以突出显示菜单上的“个人资料”项目。

    用户控件中的菜单是根据数据库中的数据动态生成的。菜单项按类别分组,并显示相应的标题,该标题也从DB中提取。

1 个答案:

答案 0 :(得分:1)

可编程地更改母版页很容易;只需在pre init上提供正确的URL,设置

protected override void OnPreInit(..)
{
    if (this.User != null) {
       if (this.User.Identity.IsAuthenticated)
            this.MasterPageFile = "~/loggedin.master";
       else
            this.MasterPageFile = "~/notloggedin.master";
    }
}

不需要基类。

用户控制方法也可以,但更改母版页文件非常容易。

编辑:如果您要设置或从主设备获取属性,您可以让代码隐藏文件实现该接口,并检查this.Master引用是否属于该接口类型。

HTH。