locked
Page.LoadControl()方法和Page.LoadTemplate方法 RRS feed

  • 问题

  • Page.LoadControl()方法和Page.LoadTemplate方法
    有什么实制性的区别

    两个都可以载入用户控件
    2007年8月10日 2:56

答案

  • 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));
    }
    2007年8月10日 3:45