Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.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
Sharepoint 是否可以在另一个web部件中加载web部件?_Sharepoint_Web Parts - Fatal编程技术网

Sharepoint 是否可以在另一个web部件中加载web部件?

Sharepoint 是否可以在另一个web部件中加载web部件?,sharepoint,web-parts,Sharepoint,Web Parts,所以,这就是我们想要做的:我们想要有一个通用的web部件,它周围有一个自定义的框架,然后在其中动态加载其他web部件(无框架)。你认为这可能吗?有点像,不仅适用于ASP.Net用户控件,还适用于其他Web部件…;) 编辑:我们现在已经可以这样做了。解决方案其实相当简单。查看代码: public class WebPartWrapper : System.Web.UI.WebControls.WebParts.WebPart { protected override void Create

所以,这就是我们想要做的:我们想要有一个通用的web部件,它周围有一个自定义的框架,然后在其中动态加载其他web部件(无框架)。你认为这可能吗?有点像,不仅适用于ASP.Net用户控件,还适用于其他Web部件…;)

编辑:我们现在已经可以这样做了。解决方案其实相当简单。查看代码:

public class WebPartWrapper : System.Web.UI.WebControls.WebParts.WebPart {
    protected override void CreateChildControls() {    
        Panel pnl = new Panel();
        this.Controls.Add(pnl);
        WebPart dynamicPart = WebPartFactory.CreateWebPart("RSSViewer");
        pnl.Controls.Add(dynamicPart);
    }
}

就这么简单。。。我们还使用反射将Web部件存储为Xml等,但这与问题无关。

我不这么认为。我之前试过这个,它抱怨只能在PageInit中添加WebPartZone项目。我认为,当初始化“容器”Web部件时,添加更多区域已经太迟了,因为保留页已经初始化。

有(至少)两种方法:使用iframe HTML元素,或者只使用一个div,其内容由JavaScript更改(可能是使用Ajax)

[注]我的回答是一般性的(即网页设计方面),我不知道在你们的技术背景下如何回答,所以也许我应该删除这个答案

public class WebPartWrapper : System.Web.UI.WebControls.WebParts.WebPart {
    protected override void CreateChildControls() {    
        Panel pnl = new Panel();
        this.Controls.Add(pnl);
        var factory = new WebPartFactory()
        WebPart dynamicPart = factory.CreateWebPart("RSSViewer", this.Guid);
        pnl.Controls.Add(dynamicPart);
    }
}

public class WebPartFactory {
    public WebPart CreateWebpart(string webpartName, Guid parentWebPartGuid)
    {
        var config = ConfigurationFactory.LoadConfiguration(webpartName);

        Assembly webPartAssembly = Assembly.Load(config.Assembly);
        Type webPartType = webPartAssembly.GetType(config.Class);
        object actualWebPart = Activator.CreateInstance(webPartType);

        foreach (var item in config.Properties)
        {
            PropertyInfo webPartProperty = webPartType.GetProperty(item.Name);
            object webPartPropertyValue = Convert.ChangeType(itemValue, Type.GetType(item.Type));
            if (!String.IsNullOrEmpty(item.Value))
                webPartProperty.SetValue(actualWebPart, webPartPropertyValue, null);
        }

        RunMethod("set_StorageKeyInternal", actualWebPart, new object[] { parentWebPartGuid });
        return actualWebPart as WebPart;
    }

    private void RunMethod(string methodName, object objectInstance, object[] methodParameters)
    {
        BindingFlags flags = BindingFlags.Instance | BindingFlags.Public |
            BindingFlags.NonPublic;

        Type t = objectInstance.GetType();
        MethodInfo m = GetMethod(t, methodName, flags);
        if (m != null)
        {
            m.Invoke(objectInstance, methodParameters);
        }
    }

    private MethodInfo GetMethod(Type instanceType, string methodName, BindingFlags flags)
    {
        MethodInfo m = instanceType.GetMethod(methodName, flags);
        if (m != null)
        {
            return m;
        }

        if (instanceType.GetType() == typeof(object) || instanceType.BaseType == null)
        {
            return null;
        }

        return GetMethod(instanceType.BaseType, methodName, flags);
    } 
}
这个代码需要一些解释。。。请原谅,如果它没有编译,我不得不删除一段相当多的原始代码,这是非常具体实现的东西。我也没有显示“config”类,它只是一个用于配置Web部件的容器,只是一组属性。我想更详细地讨论两个问题:

  • parentWebPartGuid-这是托管Web部件的Guid(UniqueId?)。出于某种原因,我们必须使用反射(它是私有属性)将“StorageKeyInternal”设置为此值。你可以不设置它,但至少对于大多数Web部件,我们必须设置它

  • Properties-这是配置值(我们在一个自定义的.xml文件中设置它们,但是可以从任何地方获取)。它看起来有点像


  • 在我们的框架中,我们还支持动态属性值等内容,但这是另一天的事情。。。希望这一切都是有意义的,可以帮助别人。

    没有机会获得WebPartFactory类的源代码吗?或者再多了解一点?可能是伪代码?如果库中有自定义web部件,则可以使用与RSSViewer相同的方式引用该部件是否正确?我只是不知道如何去做你在这里所做的事情,我非常想更好地理解如何去做


    谢谢

    当一个用户想要在另一个自定义Web部件中实例化一个自定义Web部件时,我在.ascx中使用以下代码

    <%@ Register tagPrefix="uc1" Namespace="Megawork.Votorantim.Intranet.Webparts_Intranet.LikeButton" Assembly="Megawork.Votorantim.Intranet, Version=1.0.0.0, Culture=neutral, PublicKeyToken=769156d154035602"  %>
    

    我现在已经发现了如何做到这一点,并将更新我的帖子以显示这一点。:)这适用于简单的Web部件,但它是否适用于利用Web部件特定的东西,如消费者/生产者等?你说的是连接,对吗?我想是的,这只是设置正确的属性值的问题。但我还没试过…你有没有试过以这种方式加载内容编辑器web部件?当我实例化一个时,即使在为web部件设置了内部存储密钥之后,它似乎也不可用……不,很抱歉,从未尝试过。可能有一些特殊的要求。我建议您使用Reflector来查看SharePoint实例化期间是否发生任何特殊情况。我们通过反射来实现这一点。所以您需要类型和程序集,然后您应该能够很好地加载它。但是有一些警告。。。我会尽快用一些代码更新我的答案。这些代码对我来说一直都很有用,我喜欢这种方式,因为实例化Web部件的唯一要求是正确的名称空间,在某些情况下,我会将其存储在sharepoint列表中,使其真正成为一种友好的方式。感谢您提供了这个伟大的解决方案。我面临的问题是WP似乎不可编辑。当我打开工具窗格以设置提要url时,我看到以下错误:“您试图更改的Web部件无效或已被其他用户删除。请刷新页面。”对发生这种情况的原因有何想法?没有,抱歉,我不知道。从我的回答可以看出,我写这本书已经快6年了,所以这种方法很有可能不再有效。从那以后,我也换了工作(两次!),所以我无法访问我们当时编写的代码。。。对不起,我帮不了你了。
    //This is the namespace of the control that will be instantiated dinamically    
    string type = "My.Custom.Namespace.WebpartToBeAdded.WebpartToBeAdded";
    
    // Instantiate the control dinamically based on his type
    System.Web.UI.WebControls.WebParts.WebPart genericWP = (System.Web.UI.WebControls.WebParts.WebPart)Activator.CreateInstance(Type.GetType(type));
    
    // sets the page to the genericWP (i dont know if this is required)
    genericWP.Page = this.Page;
    
    // Note: if you want to call custom methods of the dinamically instantiated controls (like a custom load method) you will need to create an interface and make your dinamically instantiated webpart implement it. You will need to do it in that file that have the following code: private const string _ascxPath @"~/_CONTROLTEMPLATES/...". Then you can do the following
    //IMyInterface ig = (IMyInterface)genericWP;
    //ig.MyCustomLoadMethod(someParam);
    
    // Adds the controls to a container, an asp panel by example.
    panelDinamicControls.Controls.Add(genericWP);