如何在SharePoint中以编程方式添加自定义菜单操作?

时间:2009-09-22 22:11:14

标签: sharepoint content-type custom-action

我需要在c#中以编程方式将自定义菜单操作添加到自定义内容类型。这是因为我不知道我需要事先链接到的URL。激活该功能时,将从配置中拉出要链接的URL。 我尝试过以下方法:

在我的Element.xml文件中添加了CustomAction:

<CustomAction
      Id="MyID"
      RegistrationType="ContentType" 
      RegistrationId="0x010100ef19b15f43e64355b39431399657766e"
      Location="EditControlBlock"
      Sequence="1000"
      Title="My Menu Item">
  <UrlAction Url="" />
</CustomAction>

在我的功能接收器FeatureActivated方法中,我有:

SPElementDefinitionCollection eleCollection = 
    properties.Feature.Definition.GetElementDefinitions(
        new System.Globalization.CultureInfo(1));

foreach (SPElementDefinition ele in eleCollection)
{
    if (ele.Id == "MyID")
    {
        System.Xml.XmlNode node = ele.XmlDefinition.FirstChild;
        node.Attributes[0].Value = "MY URL";
        ele.FeatureDefinition.Update(true);
    }
}

我希望此代码使用“我的网址”更新UrlAction网址,但事实并非如此。如果我在XML中硬编码URL它可以工作,但我必须能够以编程方式进行。

3 个答案:

答案 0 :(得分:7)

您可以在SPWeb对象上使用SPUserCustomActionCollection:

        using (SPSite site = new SPSite("http://moss.dev.com"))
        using (SPWeb web = site.OpenWeb())
        {
            SPContentType contentType = web.ContentTypes["Curriculum Vitae"];

            SPUserCustomAction action = web.UserCustomActions.Add();
            action.RegistrationType = SPUserCustomActionRegistrationType.ContentType;
            action.RegistrationId = contentType.Id.ToString();
            action.Location = "EditControlBlock";
            action.Sequence = 450;
            action.Title = "Test";
            action.Rights = SPBasePermissions.EditListItems;
            action.Url = "http://www.google.com";

            action.Update();
        }

这样,您可以将URL设置为您想要的任何内容。如果要更新现有的自定义操作,则可以遍历该集合并更新要查找的集合。安装自定义操作后更新元素XML定义不会执行任何操作。

答案 1 :(得分:2)

根据您想要实现的目标,您可以使用一些javascript;

<UrlAction Url="JavaScript:window.location='{SiteUrl}/_layouts/CustomListAction.aspx?ID={ListId}'"/>

~site和~siteCollection也有效:

<UrlAction Url="~site/_layouts/Page.aspx?ID={ListId}"/>

答案 2 :(得分:1)

我认为WSS架构定义不允许在UrlAction元素中使用空的Url属性。也许尝试在稍后覆盖的xml中放置一个“默认”url?