Esta pregunta es la que me vino a la mente ante una duda que me plantearon hace unos días…mi respuesta fue como en otras ocasiones: “se tiene que poder de alguna forma”…y dicho y hecho, las características se pueden activar de forma programática tanto en el modelo de objetos (MO) en servidor como en cliente:
-
MO Servidor:
-
MO Cliente, sabor ECMAScript:
Si pensamos como activar una feature con el MO Cliente .NET Managed, tendremos que recurrir a la clase FeatureCollection,que nos permite acceder a la colección de características activas en un sitio y activar features existentes que no estén activas de acuerdo al siguiente código:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5:
6:
7: //MO Cliente -> .NET Flavour
8: using MO_NET = Microsoft.SharePoint.Client;
9:
10: namespace SPFeatureCOMActivation
11: {
12: class Program
13: {
14: const string sSiteUrl = "http://demo2010a:100/sites/SCR";
15: static void Main(string[] args)
16: {
17: ActivarFeature();
18: Console.ReadLine();
19: }
20: static void ActivarFeature()
21: {
22: try
23: {
24: using (MO_NET.ClientContext ctx =
25: new MO_NET.ClientContext(sSiteUrl))
26: {
27: MO_NET.Web wSite = ctx.Web;
28: MO_NET.FeatureCollection fcFeaturesCollection = wSite.Features;
29: Guid guFeatureGuid = new Guid("bc08fd10-39b5-4a54-b1d9-2eb0aaac47d8");
30: fcFeaturesCollection.Add(
31: guFeatureGuid, true, MO_NET.FeatureDefinitionScope.Site);
32:
33: ctx.Load(fcFeaturesCollection);
34: ctx.ExecuteQuery();
35:
36: Console.WriteLine("Características instaladas en el sitio: {0}",
37: fcFeaturesCollection.Count.ToString());
38: foreach (MO_NET.Feature fFeature in fcFeaturesCollection)
39: if (fFeature.DefinitionId == new Guid("bc08fd10-39b5-4a54-b1d9-2eb0aaac47d8"))
40: Console.WriteLine("Feature {0} localizada", fFeature.Tag);
41: // Console.WriteLine("Feature ID: {0}", fFeature.DefinitionId);
42: }
43:
44: }
45: catch (MO_NET.InvalidQueryExpressionException ex)
46: {
47: Console.WriteLine("Error: {0}", ex.Message);
48: }
49: catch (MO_NET.ClientRequestException ex)
50: {
51: Console.WriteLine("Error: {0}", ex.Message);
52: }
53: catch (MO_NET.PropertyOrFieldNotInitializedException ex)
54: {
55: Console.WriteLine("Error: {0}", ex.Message);
56: }
57: catch (MO_NET.ServerUnauthorizedAccessException ex)
58: {
59: Console.WriteLine("Error: {0}", ex.Message);
60: }
61: catch (MO_NET.ServerException ex)
62: {
63: Console.WriteLine("Error: {0}", ex.Message);
64: }
65: catch (Exception ex)
66: {
67: Console.WriteLine("Error: {0}", ex.Message);
68: }
69: }
70: }
71: }
Como veis, a partir del GUID de la feature resulta muy sencillo su activación sin más que utilizar el método Add() del objeto FeatureCollection definido.