SharePoint - celá cesta k dokumentu

Problém

Potřebuji v kódu pracovat s celou cestou k dokumentu v knihovně dokumentů.

Řešení

spListItem["EncodedAbsUrl"] 

SharePoint 2013 - změna odkazu pro editaci ContentTypu

Problém

Potřebuji při editaci obsahu v listu editovat data ve vlastní (custom) stránce.

Řešení

Je potřeba změnit URL v Content Typu na požavanou stránku. Lze to udělat minimálně 2 způsoby (viz níže):

  • V XML definici pro Content Typ
  • programově kodem

XML definice

Lze to provést XML definici pro zaklani custom listu v souboru Schema.xml.

<ContentTypes>
  <ContentType ID="0x0100DD4C86551351479685D17668C23A9883" Name="OdeslanaDatovaZprava" Group="Moje" Description="" Inherits="TRUE" Version="0">
    <FieldRefs>
      <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" DisplayName="Zpráva ID" Name="Title" Required="TRUE" />
        <FieldRef ID="{67bda4af-695a-4649-8e70-e0f97b556e1e}" DisplayName="Čas doručení" Required="FALSE" Name="DeliveryTime" Format="DateTime" />
        ....
        ....
    </FieldRefs>
    <XmlDocuments>
      <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url">
        <FormUrls xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url">
          <Display>_layouts/15/PROJEKT/dispform.aspx</Display>
          <Edit>_layouts/15/PROJEKT/editform.aspx</Edit>
          <New>_layouts/15/PROJEKT/newform.aspx</New>
        </FormUrls>
      </XmlDocument>
    </XmlDocuments>
  </ContentType>
</ContentTypes>

Programově

Lze to udělat následujícím kódem. Využití např. v konzolové aplikaci pro jednorázové nasazení.

SPWeb web = SPContext.Current.Web;
 
web.AllowUnsafeUpdates = true;
 
SPContentType ct = web.ContentTypes["Muj Your Content Type"];
 
ct.EditFormUrl = "_layouts/editform.aspx";
ct.NewFormUrl = "_layouts/newform.aspx";
ct.DisplayFormUrl = "_layouts/dispform.aspx";
 
ct.Update();

Odkazy

http://blog.qumsieh.ca/2009/05/15/how-to-change-the-default-editform-newform-and-dispform/

SharePoint 2007 - problém s WSS

Problém

Mám vlastní webovou službu, která zapisuje do listu.  Vše proběhne v pořádku, až na poslední krok, kdy se ukládá položka. Vyskočí chyba Operation is not valid due to the current state of the object.

Řešení

Je potřeba vynulovat HttpContext, viz příklad.

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    HttpContext.Current = null;
    using (SPSite site = new SPSite(targetWeb))
    {
        using (SPWeb web = site.OpenWeb())
        {
            SPList targetlist = web.Lists[targetList];
            foreach (ItemType item in import.item)
            {
   	        ...
            }
        }
    }
});

Odkazy
http://social.msdn.microsoft.com/Forums/en-US/32869ac6-4f47-46b8-accf-f56966ac9581/operation-is-not-valid-due-to-the-current-state-of-the-object-at?forum=sharepointdevelopmentlegacy

SharePoint 2007 - tvorba vlastní WSS

Celý postup tvorby vlastní webové služby.

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

HttpHandler - chyba 417

Problém
Po nasazení HttpHandleru se v aplikaci objevila chyba:

The request failed with HTTP status 417: Expectation failed.

Řešení
Upravit Web.Config

<system.net>
 <settings>
  <servicePointManager expect100Continue="false" />
 </settings>
</system.net>

Přidat do kódu:

System.Net.ServicePointManager.Expect100Continue = false;

Odkazy
CodeProject.com: The request failed with HTTP status 417: Expectation failed
MSDN.com: ServicePointManager.Expect100Continue Property

HttpHandler pro SharePoint 2013

Zde je postup, jak vytvořit HttpHandler pro SharePoint 2010/2013.

Založit soubor AjaxHandler.cs

using System;
using System.Web;
using Microsoft.SharePoint;

namespace MyNamespace
{
    public class AjaxHandler : IHttpHandler
    {
        public bool IsReusable
        {
            get { return false; }
        }
         
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.CacheControl = "no-cache";
            context.Response.AddHeader("Pragma", "no-cache");
            context.Response.Expires = -1;
            context.Response.Write("Vysledek");
        }
    }
}

Založit soubor AjaxHandler.ashx do adresáře Assembly/Layouts/MojeReseni/

<%@ Assembly Name="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Assembly Name="MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a8b85743f45aceb0" %>
<%@ WebHandler Language="C#"  Class="MyNamespace.AjaxHandler" %>

Odkazy
Deploying an ASP.NET HttpHandler to SharePoint 2010

EventReceiver - kontrola duplicity položky

Problém
Mám custom list, kde se vkládají kontakty na firmy. Uživatele vkládají název (povinný údaj), IČ (není povinný údaj) a adresa apod.
Potřebuji kontrolovat, jestli už vložené IČ není někde použito.

Řešení
Použít EventReceiver a třídu ItemAdding.

Kód

public override void ItemAdding(SPItemEventProperties properties)
{
    base.ItemAdding(properties);

    //nacte obsah pole
    var tmp = properties.AfterProperties["FieldIC"];

    //pokud není pole prázdne, pokračuje v kontrole
    if (tmp != null && !string.IsNullOrEmpty(tmp.ToString()))
    {
        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            using (SPSite site = new SPSite(properties.OpenSite().ID))
            {
                using (SPWeb web = site.OpenWeb())
                {
                    bool isExists = false; 
                    //provést kontrolu, jestli IČ již neexistuje    

                    //pokud záznam existuje, vyhodí vyjimku
                    if (isExists)
                    {
                        properties.Status = SPEventReceiverStatus.CancelWithError;
                        properties.Cancel = true;
                        properties.ErrorMessage = "IČ je již v kontaktech použito.";
                    }
                }
            }
        });
    }
}

Práce s Base64 v C#

Zde je třída pro práci s Base64 hodnotami.

public class Base64
{
    /// <summary>
    /// Provede Encoding
    /// </summary>
    /// <param name="toEncode">vstupni hodnota</param>
    /// <returns>Base64 vystup</returns>
    public static string EncodeTo64(string toEncode)
    {
        byte[] toEncodeAsBytes = System.Text.Encoding.Unicode.GetBytes(toEncode);
        return System.Convert.ToBase64String(toEncodeAsBytes);
    }

    /// <summary>
    /// Provede decoding
    /// </summary>
    /// <param name="encodedData">vstupni hodnota v Base64</param>
    /// <returns>dekodovany vystup</returns>
    public static string DecodeFrom64(string encodedData)
    {
        byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
        return System.Text.Encoding.Unicode.GetString(encodedDataAsBytes);
    }
}

SharePoint 2007/2010/2013 - nástroje I.

CAML.NET

Tvorba CAML dotazů. Určeno pro vývojáře.
http://camldotnet.codeplex.com/

Camlex.NET

Tvorba CAML dotazů. Určeno pro vývojáře.
http://camlex.codeplex.com/

SharePoint Dispose Checker Tool

Kontrola kódu. Určeno pro vývojáře,
http://archive.msdn.microsoft.com/SPDisposeCheck

SharePoint Event Receiver Manager (2007 & 2010)

Správa Event Receiverů
http://speventreceiverman.codeplex.com/

SharePoint Solution Installer

http://sharepointinstaller.codeplex.com/

SharePoint Learning Kit

Certifikované e-Learnig řešení.
http://slk.codeplex.com/

AutoSPInstaller

Automatická instalace pomoci PowerShellu.
http://autospinstaller.codeplex.com/

SharePoint log viewer

Prohlížení ULS logů.
http://splogviewer.codeplex.com/

SharePoint OCR image files indexing

IFilter pro SharePoint.
http://wssocr.codeplex.com/

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