Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTechCon


Published on

Technical Class:

  • Be the first to comment

  • Be the first to like this

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTechCon

  1. 1. Advanced SharePoint2010 and 2013 Web PartDevelopmentRob
  2. 2. About Me• Senior SharePoint Architect with Portal Solutions• Technical Contributor to the Pluralsight On-Demand Library• Microsoft MVP, MCPD, MCT• Founder and Past-President of the North Toronto .NET UG• Co-author of Prof. Visual Basic 2012 and .NET 4.5 (Wrox)
  3. 3. Session Prerequisites• Experience developing for SharePoint• Experience building Web Parts
  4. 4. Agenda• Visual Web Parts• Persistent Web Part Properties• Editor Parts• Connectable Web Parts• Web Part Verbs• Asynchronous Web Parts• Web Part Gallery• Web Part Pages
  5. 5. Visual Web Parts• Visual web parts traditionally combine a web part with a user control• User controls have full design experience in Visual Studio• User interface and code behind defined in user control• Web part “injects” user control dynamically using Page.LoadControl private const string _ascxPath = @"~/_CONTROLTEMPLATES/.../MyUserControl.ascx"; protected override void CreateChildControls() { Control control = Page.LoadControl(_ascxPath); Controls.Add(control); }
  6. 6. Web Parts in Sandboxed Solutions• Split page rendering  Page code runs in ASP.NET worker process  Sandboxed web part code runs in sandbox worker process  HTML markup and JavaScript from two worker processes merged• Sandbox restrictions  Reduced set of server object model API  Restricted access outside SharePoint  No elevation of permissions  Cannot deploy files to SharePoint system folders  Must be ASP.NET web parts  Can only use ASP.NET controls  No web part connections
  7. 7. Sandbox Visual Web Part Template• Native visual web part template not compatible with sandboxed solutions  Attempts to deploy user control to system folders• Visual Studio 2010 Power Tools introduced a sandbox compatible template  No user control  Designer makes web part behave like a user control  Markup in user control converted to code at design time• Visual Studio 2012 only has this template
  8. 8. DEMOVisual Web Parts
  9. 9. Web Part Properties• Web Parts support persistent properties• Configure properties via attributes  Personalizable(param)  Directs SharePoint to persist property value  Parameter indicates if property may be personalized  WebBrowsable(true)  Directs SharePoint to generate interface to edit property  WebDisplayName, WebDescription  The prompt and tooltip that accompany the data entry element  Category  The group in which the properties will be shown [Personalizable(PersonalizationScope.Shared)] [WebBrowsable(true)] [WebDisplayName("Year")] [Category("Pluralsight")] public int Year { get; set; }
  10. 10. DEMOWeb Part Properties
  11. 11. Cross Site Script Safeguards• Added in SharePoint 2010• Indicates developer has taken steps to ensure code is safe against scripting attacks• Two key pieces  SafeAgainstScript attribute of SafeControl entry  RequiresDesignerPermission attribute• Contributors can only set web part properties if:  SafeAgainstScript is true (not the default)  RequiresDesignerPermission is false (default)
  12. 12. DEMOCross Site ScriptSafeguards
  13. 13. Editor Parts• Editor parts enable user customization• Editor parts contained within an editor zone• ASP.NET supplies standard editor parts  Layout, appearance, etc• Developers can create custom editor parts  Similar development experience to Web Part  Control over interface used to edit properties  Ability to validate user input• In web part  Override CreateEditorParts• In editor part  Override CreateChildControls, SyncChanges and ApplyChanges
  14. 14. DEMOEditor Parts
  15. 15. Creating Connectable Web Parts• Pass data from one web part to another• Loosely-coupled connection  Communication managed by WebPartManager  Provider web part supplies data  Consumer web parts retrieve data• Interface used to define data contract  ASP.NET has standard connection contracts  Shown later in this module  Can use custom connection contracts• SharePoint provides user interface elements to establish connections• Not compatible with sandboxed solutions
  16. 16. DEMOWeb PartConnections
  17. 17. Web Part Connections using Ajax• Communication between web parts requires a postback• Generally, only consumer web part needs to be updated• Can use partial page rendering (UpdatePanel) to only update consumer• Problem:  Event triggered by provider  UpdatePanel in consumer• Solution:  Pass reference to control that triggers update from provider to consumer  Consumer registers control as AsyncPostbackControl with ScriptManager
  18. 18. DEMOWeb Part ConnectionsUsing Ajax
  19. 19. Web Part Verbs• Add additional menu options to dropdown at top-right of Web Part• Can be handled client-side, server- side or both.
  20. 20. Web Part Verbs public override WebPartVerbCollection Verbs { get { var verbs = new List<WebPartVerb>(); var verb1 = new WebPartVerb(this.ID + "_ClientSideRssOpenerVerb", string.Format("{0},RSSXML)", this.FeedUrl)); verb1.Description = "Open RSS Feed in an external window"; verb1.Text = "Open RSS Feed"; verbs.Add(verb1); var verb2 = new WebPartVerb(this.ID + "_ServerSideRssOpenerVerb", new WebPartEventHandler(ServerSideVerbHandler)); verb2.Description = "Load the RSS Source Feed."; verb2.Text = "View RSS Source Feed"; verbs.Add(verb2); var allverbs = new WebPartVerbCollection(base.Verbs, verbs); return allverbs; } }
  21. 21. DEMOWeb Part Verbs
  22. 22. Asynchronous Web Parts• Long running tasks are blocking calls  One web part can bring a page to a crawl  When on the same page, multiple instances can kill the user experience• Make long running tasks asynchronous  Don’t hold up page processing
  23. 23. Asynchronous Web Parts protected void Page_PreRender(object sender, EventArgs e) { Page.RegisterAsyncTask( new PageAsyncTask( new BeginEventHandler(BeginFeed), new EndEventHandler(EndFeed), new EndEventHandler(TimoutFeed), null, true)); } public IAsyncResult BeginFeed(object sender, EventArgs e, AsyncCallback cb, object state) { _feedCaller = GetFeed; return _feedCaller.BeginInvoke(cb, state); } public void EndFeed(IAsyncResult ar) { var feed = _feedCaller.EndInvoke(ar); var posts = from item in feed.Descendants("item") select new { Title = item.Element("title").Value, Description = item.Element("description").Value, Published = DateTime.Parse(item.Element("pubDate").Value) }; posts = posts.Skip(_pageNum * _hostPart.PageSize).Take(_hostPart.PageSize); FeedListView.DataSource = posts.ToList(); FeedListView.DataBind(); }
  24. 24. DEMOAsync Web Parts
  25. 25. Cleaning the Web Part Gallery• Files provisioned into Content DB do not get removed on Feature deactivation  This includes webpart / dwp files added to Web Part Gallery• Deletion of files can be done in Feature receiver  Examine element manifests to find web parts  Remove from web part gallery
  26. 26. Cleaning the Web Part Gallery public override void FeatureDeactivating(SPFeatureReceiverProperties properties) { var site = properties.Feature.Parent as SPSite; if (site == null) return; var parts = new List<string>(); var elements = properties.Definition.GetElementDefinitions(CultureInfo.CurrentCulture); foreach (SPElementDefinition element in elements) { if (element.ElementType != "Module") continue; var node = element.XmlDefinition; if (node.Attributes["Url"].Value != "_catalogs/wp") continue; foreach (XmlElement childNode in node.ChildNodes) { if (childNode.Name == "File") { parts.Add(childNode.GetAttribute("Url")); } } } var web = site.RootWeb; var gallery = web.Lists["Web Part Gallery"]; var items = gallery.Items; for (int i = items.Count - 1; i >= 0; i--) { var item = items[i]; if (parts.Contains(item.File.Name)) { item.Delete(); } } }
  27. 27. DEMOCleaning the WebPart Gallery
  28. 28. Creating Web Part Page Templates• Create a site page• Set base type to Microsoft.SharePoint.WebPartPages.WebPartPage• Add one or more web part zones to page• Provision page instances using Module<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %><!-- Other register directives --><%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=, …" %><%@ Page Language="C#" Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage" MasterPageFile="~masterurl/default.master" %><asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server"> <WebPartPages:WebPartZone ID="MainZone" runat="server" FrameType="TitleBarOnly" Title="Main Web Part Zone" /></asp:Content>
  29. 29. Adding Web Parts to Web Part Pages• Use SPLimitedWebPartManager  Get reference from property of Page object• Use SPLimitedWebPartManager.AddWebPart to addvar page = web.GetFile("SiteAssets/Test02.aspx");using (var manager = page.GetLimitedWebPartManager( PersonalizationScope.Shared)) { if (!manager.WebParts.Contains(webPartTitle)) { var part = new MostPopularProducts2.MostPopularProducts2(); part.Title = "Most Popular Products"; part.Category = "Condiments"; part.Year = 1997; manager.AddWebPart(part, "Left", 0); }} Note: Contains method shown in code sample is a custom extension
  30. 30. DEMOCreating Web PartPages and AddingWeb Parts
  31. 31. Additional Stuff• Closing versus deleting web parts  Closing a web part does not remove it from page  Having many closed web parts on a page can degrade performance  Set AllowClose to false to remove option to close from web part verbs• Versioning  DO NOT change the assembly version of your assemblies  SharePoint stores the full name with version of all web parts in galleries and on pages  Use the AssemblyFileVersion instead
  32. 32. Thank You• Big thanks to the organizers, sponsors and you for making this event possible• Please fill out your evaluation• Please keep in touch @robwindsor