8

我需要在 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);
    }
}

我希望这段代码能用“MY URL”更新 UrlAction Url,但事实并非如此。如果我在 XML 中硬编码一个 URL,它可以工作,但我必须能够以编程方式完成它。

4

3 回答 3

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 定义不会执行任何操作。

于 2010-11-08T15:09:16.680 回答
2

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

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

~site 和 ~siteCollection 也有效:

<UrlAction Url="~site/_layouts/Page.aspx?ID={ListId}"/>
于 2009-11-18T17:53:11.303 回答
1

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

于 2010-02-25T23:08:19.167 回答