集中每个网页的功能

时间:2012-11-15 12:46:54

标签: asp.net master-pages

我有一个ASP.Net 4.0 Web应用程序,其页面有一个共同的布局(顶部导航栏,左侧导航栏,徽标等...)。 Masterpages对于布局部分来说是完美的,这正是我计划使用的。我不习惯使用Masterpage,因此我的许多计划仍有待测试。 但是,我还希望我的页面具有一些应该在呈现页面HTML之前执行的常用功能。此功能包括检查用户是否有权访问该页面。此外,常见功能在页面之间略有不同。有些页面甚至不需要它。 您可能认为在主页中包含此功能是显而易见的,并且功能取决于请求的内容页面。 但是它必须在内容页面page_load触发之前放置,因为它的结果会影响呈现页面。 是否有最佳实践可以放置此功能,因为我们知道需要内容页面中的信息来参数化功能。 理想情况下,它将位于Masterpage的OnInit()中,因为它在所有之前运行。但我不相信我现在可以从内容页面中检索必要的信息。

非常感谢 圣战

3 个答案:

答案 0 :(得分:0)

您可以尝试编写自己的HttpModule。

This discussion should help

答案 1 :(得分:0)

MasterPage不适合此功能。最好的地方是在自定义基页面类中,您的特殊功能在派生页面中。这样,您就可以继承自定义类,并逐页调用所需的功能。

public class MyCustomPage : System.Web.UI.Page
{
    public bool IsAuthorized(string someCriteria)
    {
        // run special check
    }
}

然后,当您在网站中创建单个页面时,只需将其继承从System.Web.UI.Page切换到您自己的类。

public class MyNewWebPage : MyNameSpace.MyCustomPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsAuthorized("myCriteria"))
            Response.Redirect("SomewhereElse.aspx");
    }
}

答案 2 :(得分:0)

最好让所有页面都从公共基类继承而不是使用主页面(主要用于布局)作为业务逻辑。

但是,如果您仍希望在MasterPage中执行此操作,则可以使用此方法,该方法使用所有需要进行身份验证的页面实现的接口INeedsAuthentication

在MasterPage的Init

protected void Page_Init(Object sender, EventArgs e)
{
    var page = HttpContext.Current.Handler as Page;
    if (page is INeedsAuthentication)
        checkAuthentication();
    else if (page is WebForm1)
        specialCondition();
    else
        commonCondition(); // for all pages, maybe do simply nothing here
}