Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行时设置ASP.NET母版页_.net_Asp.net_Master Pages - Fatal编程技术网

在运行时设置ASP.NET母版页

在运行时设置ASP.NET母版页,.net,asp.net,master-pages,.net,Asp.net,Master Pages,我在一个网站上工作,它需要能够支持两个或更多的外观,在运行时可以改变。我希望能够用CSS开关处理更改,但看起来我需要为每个设计使用不同的母版页 那么,在运行时设置母版页的最佳方法是什么?只能在Page.OnPreInit事件中设置Page.MasterPageFile。看起来解决方案是让我的所有页面都从处理PreInit事件的公共基继承,或者使用一个处理PreInit事件的HttpModule 有什么建议吗?与其说是两个不同的母版页,不如让一个母版页动态加载不同的用户控件和内容HTML文本?我以

我在一个网站上工作,它需要能够支持两个或更多的外观,在运行时可以改变。我希望能够用CSS开关处理更改,但看起来我需要为每个设计使用不同的母版页

那么,在运行时设置母版页的最佳方法是什么?只能在Page.OnPreInit事件中设置Page.MasterPageFile。看起来解决方案是让我的所有页面都从处理PreInit事件的公共基继承,或者使用一个处理PreInit事件的HttpModule


有什么建议吗?

与其说是两个不同的母版页,不如让一个母版页动态加载不同的用户控件和内容HTML文本?

我以前做过一次,我完全按照您所描述的做了(使所有页面都从带有OnPreInit事件的自定义页面继承)。另外,我在我的Global.asax.cs中有一个自定义应用程序_PreRequestHandlerExecute,用于设置Page.StyleSheetTheme,以进行不需要不同母版页的图像/css更改。

处理PreInit并插入加载正确母版页所需的一行代码非常简单

this.Page.MasterPageFile = "~/default.master";

在没有令人信服的理由不走这条路线的情况下,不管您在哪里处理PreInit,我都会这么做。

我很好奇,是什么决定了页面的外观?是用户单击按钮来更改主题吗?是否基于用于访问该站点的URL

母版页中支持代码隐藏,因此您可以在一个母版页中加入一些逻辑来决定应该显示什么

我见过一些网站根据用户点击设置cookie(改变字体大小或页面宽度),然后根据cookie的值应用不同的CSS文件。如果不存在cookie,则显示默认外观

编辑:

这里的另一个想法是,如果您只是想切换出CSS,那么将样式标记设置为在服务器上运行,并在运行时为其分配属性。这同样需要使用一个母版页,并将代码放在母版页后面,可能是在PreInit事件处理程序中

因为我从未实现过这个解决方案,所以我不确定整个标记是否必须在服务器上运行


<html>
<head id="Head" runat="server">
<style id="StylePlaceholder" runat="server" type="text/css"></style>
</head>

我感觉到了你的痛苦。我花了大约一个小时(如果不是更多的话)来寻找这个问题,但没有成功。当你有几百页的时候,说“在每一页上从PreInit调用它”并不是简单的回答。但后来我意识到,我花在寻找解决方案上的时间比在每一页上都要多

但是,我想基于概要文件属性设置MasterPageFile,这样每个页面大约有5行代码,这是一个维护性的噩梦。不管怎样,“不要重复你自己”,对吗

因此,我在App_Code文件夹中的一个模块中创建了一个扩展方法,使其更容易维护

Public Module WebFunctions

    <System.Runtime.CompilerServices.Extension()> _
    Public Sub SetMaster(ByVal page As Page)

        Dim pb As ProfileCommon = DirectCast(HttpContext.Current.Profile, ProfileCommon)

        If pb IsNot Nothing Then
            page.MasterPageFile = pb.MasterPage
        End If

    End Sub

End Module

从基类继承所有页面,如

public class PageBase : System.Web.UI.Page
{
    public PageBase()
    {
        this.PreInit += new EventHandler(PageBase_PreInit);
    }
    void PageBase_PreInit(object sender, EventArgs e)
    {
        this.MasterPageFile = "~/MyMasterPage.Master";
    }
}
public class PageBase : System.Web.UI.Page
{
    public PageBase()
    {
        this.PreInit += new EventHandler(PageBase_PreInit);
    }
    void PageBase_PreInit(object sender, EventArgs e)
    {
        this.MasterPageFile = "~/MyMasterPage.Master";
    }
}