SharePoint - nasazení EventReceiveru do SubWebu

Zadání

Potřebuji nasadit EventReceiver na konkrétní vlastní list v podwebu.

Postup

1) Založím novou Features akci Add Faeture
Vytvoří se např. následující kód.

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Receivers ListTemplateId="100">
    <Receiver>
      <Name>MujListReceiverItemAdded</Name>
      <Type>ItemAdded</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>MojeDLL.MujListReceiver</Class>
      <SequenceNumber>10000</SequenceNumber>
    </Receiver>
  </Receivers>
</Elements>

Po nasazení WSP balíčku se při aktivaci ER nastavaví na všechny vlastní listy.

2) Potřebuji ER nastavit na konkrétní list.

Provedu úprava souboru Element.XML

<Receivers ListUrl="Lists/MujList">

3) Konkrétní list není rootu webu, ale v podwebu

Při nasazování to hlásí chybu, že Feature nelze aktivovat, protože list není k dispozici.

4) Řešením je úprava konfigurace

Projekt > Vlastnosti > Site URL > http://mujweb/ zmenit na  http://mujweb/subweb

Features > MojeFeatura > Vlastnosti > Activate On Default = false

Odkazy

http://notuserfriendly.wordpress.com/2013/11/28/add-an-event-receiver-to-a-specific-list-instance/

EventReceiver - vytvoření kontextového menu

Zadání
potřebuji vytvořit Feature pro aktivaci kontextového menu v aktuálním webu pro knihovnu typu "Kontakt".

Řešení
Vytvořím EventReceiver, který aktivuji pomoci Feature ve Scope = Web. Tzn. akce se založí pouze pro knihovny v aktuálním webu.

Kód EvenReceiveru
FeatureActivated

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPWeb web = (SPWeb)properties.Feature.Parent;

    SPContentType contentType = web.Site.RootWeb.ContentTypes["Kontakt"];
    SPUserCustomAction action = web.UserCustomActions.Add();

    action.RegistrationType = SPUserCustomActionRegistrationType.ContentType;
    action.RegistrationId = contentType.Id.ToString();
    action.Location = "EditControlBlock";
    action.Sequence = 450;
    action.Title = "Moje menu";
    action.Rights = SPBasePermissions.EditListItems;
    action.Url = "/_Layouts/MojeUrl..aspx";
    action.Update();
}

FeatureDeactivating

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
    SPWeb web = (SPWeb)properties.Feature.Parent;

    SPContentType contentType = web.Site.RootWeb.ContentTypes["Kontakt"];
    foreach (SPUserCustomAction action in web.UserCustomActions)
    {
        if (action.Name != null && action.Title.Equals("Moje menu"))
        {
            action.Delete();
            web.Update();
            break;
        }
    }
}

Odkazy
MSDN: SPUserCustomAction members

O blogu

Tento blog je místem, kde sdílím své zkušenosti, části zdrojových kódů, odkazy apod. Zdroje jsou zaměřeny převážně na problematiku portálového řešení SharePoint a vývoj webů v prostředí Microsoft. Mým cílem není úplně obsahnout konkrétní řešení, ale pouze tu část, kterou potřebuji. Pokud se problematika obsáhlejší, jsou pod článkem odkazy na související informace.

O autorovi

Oldřich Zátopek
Zabývám se vývojem webových aplikací internet/intranet na Microsoft technologiích. Hlavní specializace je SharePoint. LinkedIn