ASP.NET—为什么母版页不能被访问?

本文详细介绍了母版的概念、框架以及为何不能被访问的原因。通过实例展示母版如何减少代码编写量并简化页面修改流程,理解其背后的原理有助于更高效地应用母版技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  1.母版(MaterPage)基础

    Ø  概念

    母版(MaterPage)是一种技术,把页面布局画好,在在变化的内容部分“留空”,留空的部分由子页面填充内容,这样子页面只要填空就行,不重复设计页面结构,一旦要修改页面结构修改母版就可以,这样所有页面都会变化。母版页“挖坑”,具体页面“填坑”。

    Ø  框架

    母版和子页面关系


    建立母版页以及其他大家在牛腩中已经接触了,这里不再细讲了。

  2.母版为什么不能被访问

    Ø  什么样的不能访问

    我们知道母版页是不能别访问的,此外还有就是css样式表,那么为什么呢?我们先看下面的普通页和母版页的不同

    这是母版的后台

<strong><span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="color:#ff0000;"> public partial class test : System.Web.UI.MasterPage</span> </span></strong>

    右键选择MasterPage转到定义:

<strong><span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="color:#ff0000;"><span style="color:#ff0000;">public class MasterPage : UserControl</span></span>
    {
        private IList _contentPlaceHolders;
        private IDictionary _contentTemplateCollection;
        private IDictionary _contentTemplates;
        private MasterPage _master;
        private bool _masterPageApplied;
        private VirtualPath _masterPageFile;
        internal TemplateControl _ownerControl;</span></strong>

    再看普通页或者子页

<strong><span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="color:#ff0000;">public partial class WebForm1 : System.Web.UI.Page</span></span></strong>

    同理转到定义

<strong><span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="color:#ff0000;"><span style="color:#ff0000;">public class Page : TemplateControl, IHttpHandler</span></span>
    {
        internal HttpApplicationState _application;
        private bool _aspCompatMode;
        private AspCompatApplicationStep _aspCompatStep;
        private bool _asyncMode;
        private PageAsyncTaskManager _asyncTaskManager;
        private TimeSpan _asyncTimeout;
        private bool _asyncTimeoutSet;</span></strong>

    细心的朋友会发现是没有实现接口,那么我们让它实现接口呢?可以看到后者实现了一个IHttpHandler接口,那么我们直接给它写上呢?写法如下。我们让其实现接口发现生成的时候会出现错误:

<pre name="code" class="csharp"> <pre name="code" class="csharp"><span style="color:#ff0000;">public partial class test : System.Web.UI.MasterPage IHttpHandler</span>



    直接运行呢当我们在浏览器中查看时会报出这样的错误:


    我们发现即使实现接口也访问不了,服务器不给于请求,那么服务器是基于什么的?是全局配置文件framework,我们知道网站有一个配置文件web.config,除了每一个网站个性化的配置,还有一个统一的配置。

    Ø  那么它拒绝的机制是怎么样的?—统一的配置

    在统一的web.config,能不能被创建是被机械地写死的,我们来看看吧。查找全局的web.config集,

C:\Windows\Microsoft.NET\Framework\v4.0.30319\TemporaryASP.NET Files\root\341431db\bf50b72e\App_Web_0bb4dwvo.dll(每个人和每个人的后面版本号可能不一样)

    这样我们可能记不住,我们可以通过这样的代码实现:

<strong><span style="font-family:KaiTi_GB2312;font-size:18px;">public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            <span style="color:#ff0000;">Response.Write(this.GetType().Assembly.Location)</span>;
        }
    }</span></strong>

    加载显示

    红线框起来是路径,后面是临时生成的,将其在c盘进行搜索:

    输入:C:\Windows\Microsoft.NET\Framework\v4.0.30319

    效果图:

    出现下面内容:

    上面这个就是全局统一配置文件,用记事本打开进行查看:



    我们可以用反编译工具进行HttpForbiddenHandler的查看,源代码:

<strong><span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="color:#cc0000;"><span style="color:#ff0000;">internal class HttpForbiddenHandler : IHttpHandler</span></span>
{
    // Methods
    [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    internal HttpForbiddenHandler();
    <span style="color:#ff0000;">public void ProcessRequest(HttpContext context);</span>

    // Properties
    public bool IsReusable { get; }
}
</span></strong>
<strong><span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="color:#ff0000;"><span style="color:#ff0000;">public void ProcessRequest(HttpContext context)</span></span>
{
    PerfCounters.IncrementCounter(AppPerfCounter.REQUESTS_NOT_FOUND);
    throw new HttpException(0x193, SR.GetString("Path_forbidden", new object[] { context.Request.Path }));
}

</span></strong>
    我们看到确实是实现了IHttpHandler接口,同时我们看到在HttpforbiddenHandler()定义了这种文件后缀名的服务器的响应方式,就是上面的ProcessRequest方法,定义执行此方式时会抛出一个异常。再看aspx文件:

<strong><span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="color:#ff0000;">public class PageHandlerFactory :<span style="color:#ff0000;"> IHttpHandlerFactory2, IHttpHandlerFactory</span></span>
{
    // Fields
    private bool _isInheritedInstance;

    // Methods
    protected internal PageHandlerFactory();
   <span style="color:#ff0000;"> public virtual IHttpHandler GetHandler</span>(HttpContext context, string requestType, string virtualPath, string path);
    private IHttpHandler GetHandlerHelper(HttpContext context, string requestType, VirtualPath virtualPath, string physicalPath);
    public virtual void ReleaseHandler(IHttpHandler handler);
    IHttpHandler IHttpHandlerFactory2.GetHandler(HttpContext context, string requestType, VirtualPath virtualPath, string physicalPath);
}
</span></strong>

    实现了接口工厂并且定义接口的创建的方法和实现方法,当点击相应的方法时会给出具体的实体,自己可以去尝试啊。

    这就解释了为什么母版不能被访问,想要了解其它的文件访问原理,自己去查看吧

  3.总结

    母版的使用不仅可以减少代码的编写量,同样可以使我们当需要修改的时候,减少修改量。知道具体的原理之后我们会对其有个更清楚的认识。仍在学习中~











评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值