Как добавить пользовательские действия меню программно в SharePoint? - PullRequest
8 голосов
/ 23 сентября 2009

Мне нужно добавить пользовательское действие меню к пользовательскому типу контента программно в c #. Это потому, что я не буду знать URL, на который мне нужно сослаться заранее. URL-адрес для ссылки будет извлечен из конфигурации при активации функции. Я пробовал следующее:

Добавлен CustomAction в моем файле Element.xml как:

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

В моем приемнике функций FeatureActivation у меня есть:

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);
    }
}

Я ожидал бы, что этот код обновит URL UrlAction с помощью "МОЙ URL", но это не так. Если я жестко закодирую URL в XML, он работает, но я должен быть в состоянии сделать это программно.

Ответы [ 3 ]

7 голосов
/ 08 ноября 2010

Вы можете использовать SPUserCustomActionCollection для объекта SPWeb:

        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 элемента после установки настраиваемого действия ничего не делает.

2 голосов
/ 18 ноября 2009

В зависимости от того, чего вы хотите достичь, вы можете использовать некоторый JavaScript;

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

Сайт ~ и ~ siteCollection также работает:

<UrlAction Url="~site/_layouts/Page.aspx?ID={ListId}"/>
1 голос
/ 26 февраля 2010

Я не думаю, что определение схемы WSS допускает пустой атрибут Url в элементе UrlAction. Может быть, попробуйте добавить URL "по умолчанию" в XML, который вы перезапишете позже?

...