Page.LoadControl和Page.LoadTemplate都是从TemplateControl继承的方法。
Page.LoadControl用来加载控件;关于TemplateControl.LoadControl方法,您可以参考MSDN文档:
http://msdn2.microsoft.com/zh-cn/library/system.web.ui.templatecontrol.loadcontrol(VS.80).aspx
Page.LoadControl方法已经重载,使用Reflector反编译的代码如下:
public Control LoadControl(string virtualPath)
{
return this.LoadControl(VirtualPath.Create(virtualPath));
}
internal Control LoadControl(VirtualPath virtualPath)
{
virtualPath = VirtualPath.Combine(base.TemplateControlVirtualDirectory, virtualPath);
BuildResult vPathBuildResult = BuildManager.GetVPathBuildResult(this.Context, virtualPath);
return this.LoadControl((IWebObjectFactory) vPathBuildResult, virtualPath, null, null);
}
public Control LoadControl(Type t, object[] parameters)
{
return this.LoadControl(null, null, t, parameters);
}
private Control LoadControl(IWebObjectFactory objectFactory, VirtualPath virtualPath, Type t, object[] parameters)
{
BuildResultCompiledType type = null;
BuildResultNoCompileUserControl control = null;
PartialCachingAttribute cacheAttrib;
if (objectFactory != null)
{
type = objectFactory as BuildResultCompiledType;
if (type != null)
{
t = type.ResultType;
Util.CheckAssignableType(typeof(UserControl), t);
}
else
{
control = (BuildResultNoCompileUserControl) objectFactory;
}
}
else if (t != null)
{
Util.CheckAssignableType(typeof(Control), t);
}
if (t != null)
{
cacheAttrib = (PartialCachingAttribute) TypeDescriptor.GetAttributes(t)[typeof(PartialCachingAttribute)];
}
else
{
cacheAttrib = control.CachingAttribute;
}
if (cacheAttrib == null)
{
Control control2;
if (objectFactory != null)
{
control2 = (Control) objectFactory.CreateInstance();
}
else
{
control2 = (Control) HttpRuntime.CreatePublicInstance(t, parameters);
}
UserControl control3 = control2 as UserControl;
if (control3 != null)
{
if (virtualPath != null)
{
control3.TemplateControlVirtualPath = virtualPath;
}
control3.InitializeAsUserControl(this.Page);
}
return control2;
}
HashCodeCombiner combinedHashCode = new HashCodeCombiner();
if (objectFactory != null)
{
combinedHashCode.AddObject(objectFactory);
}
else
{
combinedHashCode.AddObject(t);
}
if (!cacheAttrib.Shared)
{
this.AddStackContextToHashCode(combinedHashCode);
}
string combinedHashString = combinedHashCode.CombinedHashString;
return new PartialCachingControl(objectFactory, t, cacheAttrib, "_" + combinedHashString, parameters);
}
Page.LoadTemplate从外部文件获取 ITemplate 接口的实例,关于TemplateControl.LoadTemplate方法,您可以参考MSDN文档:http://msdn2.microsoft.com/zh-cn/library/system.web.ui.templatecontrol.loadtemplate(VS.80).aspx
Page.LoadTemplate方法使用Reflector反编译的代码如下:
public ITemplate LoadTemplate(string virtualPath)
{
return this.LoadTemplate(VirtualPath.Create(virtualPath));
}
internal ITemplate LoadTemplate(VirtualPath virtualPath)
{
virtualPath = VirtualPath.Combine(base.TemplateControlVirtualDirectory, virtualPath);
return new SimpleTemplate((ITypedWebObjectFactory) BuildManager.GetVPathBuildResult(this.Context, virtualPath));
}