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