Hoy me he encontrado que algo tan “sencillo”, como añadir “options” a un campo de tipo SPFieldChoice, no es tan sencillo cuando lo hacemos en SharePoint online.
Si queremos añadir una opción más a un campo dado, el código sería tan sencillo como:
1 |
<span style="color: #606060" id="lnum1"> 1:</span> <span style="color: #0000ff">try</span> |
1 |
<span style="color: #606060" id="lnum2"> 2:</span> { |
1 |
<span style="color: #606060" id="lnum3"> 3:</span> SPList list = SPContext.Current.Web.Lists.TryGetList(<span style="color: #006080">"Products"</span>); |
1 |
<span style="color: #606060" id="lnum4"> 4:</span>  |
1 |
<span style="color: #606060" id="lnum5"> 5:</span> <span style="color: #0000ff">if</span> (list == <span style="color: #0000ff">null</span>) |
1 |
<span style="color: #606060" id="lnum6"> 6:</span> { |
1 |
<span style="color: #606060" id="lnum7"> 7:</span> <span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span> SPException(<span style="color: #006080">"List not found"</span>); |
1 |
<span style="color: #606060" id="lnum8"> 8:</span> } |
1 |
<span style="color: #606060" id="lnum9"> 9:</span>  |
1 |
<span style="color: #606060" id="lnum10"> 10:</span> SPFieldChoice fieldChoice = list.Fields.GetField(<span style="color: #006080">"ChoiceColumn"</span>) <span style="color: #0000ff">as</span> SPFieldChoice; |
1 |
<span style="color: #606060" id="lnum11"> 11:</span> fieldChoice.Choices.Add(<span style="color: #006080">"New option"</span>); |
1 |
<span style="color: #606060" id="lnum12"> 12:</span>  |
1 |
<span style="color: #606060" id="lnum13"> 13:</span> fieldChoice.Update(); |
1 |
<span style="color: #606060" id="lnum14"> 14:</span> } |
1 |
<span style="color: #606060" id="lnum15"> 15:</span> <span style="color: #0000ff">catch</span> (Exception ex) |
1 |
<span style="color: #606060" id="lnum16"> 16:</span> { |
1 |
<span style="color: #606060" id="lnum17"> 17:</span> TextBox1.Text = ex.ToString(); |
1 |
<span style="color: #606060" id="lnum18"> 18:</span> } |
Si eso mismo, lo desplegamos en una solución de granja, funciona perfectamente.
Sin embargo, si lo hacemos en una solución sandbox, no obtendremos ningún error, pero la opción nunca se añadirá al SPFieldChoice.
En principio, la clase SPFieldChoice es perfectamente válida en Sandboxed solutions, su propiedad Choices también lo es.
El motivo lo desconozco por completo, y además, me parece rarísimo, ya que he revisado con Reflector el código del método UpdateInternal, y me parece de lo más sencillo, así que no me explico que puede haber diferente en la dll de la Sandbox, para que no funcione.
Por suerte, sí tenemos solución, y es tan “sencilla”, como editar la propiedad SchemaXml, y añadirle el XML necesario para la nueva Opción. Aquí podemos ver un ejemplo:
1 |
<span style="color: #606060" id="lnum1"> 1:</span> <span style="color: #0000ff"><</span><span style="color: #800000">Field</span> <span style="color: #ff0000">Type</span><span style="color: #0000ff">="Choice"</span> <span style="color: #ff0000">DisplayName</span><span style="color: #0000ff">="ChoiceColumn"</span> <span style="color: #ff0000">Required</span><span style="color: #0000ff">="FALSE"</span> <span style="color: #ff0000">EnforceUniqueValues</span><span style="color: #0000ff">="FALSE"</span> <span style="color: #ff0000">Indexed</span><span style="color: #0000ff">="FALSE"</span> <span style="color: #ff0000">Format</span><span style="color: #0000ff">="Dropdown"</span> <span style="color: #ff0000">FillInChoice</span><span style="color: #0000ff">="FALSE"</span> <span style="color: #ff0000">ID</span><span style="color: #0000ff">="{5a7765f4-07c7-4dd9-8237-1f73174bede0}"</span> <span style="color: #ff0000">SourceID</span><span style="color: #0000ff">="{e71844c7-9724-47c7-92d1-6c279e3ad8a0}"</span> <span style="color: #ff0000">StaticName</span><span style="color: #0000ff">="ChoiceColumn"</span> <span style="color: #ff0000">Name</span><span style="color: #0000ff">="ChoiceColumn"</span> <span style="color: #ff0000">ColName</span><span style="color: #0000ff">="nvarchar3"</span> <span style="color: #ff0000">RowOrdinal</span><span style="color: #0000ff">="0"</span> <span style="color: #ff0000">Version</span><span style="color: #0000ff">="3"</span><span style="color: #0000ff">></span> |
1 |
<span style="color: #606060" id="lnum2"> 2:</span> <span style="color: #0000ff"><</span><span style="color: #800000">Default</span><span style="color: #0000ff">></span>Option 1<span style="color: #0000ff"></</span><span style="color: #800000">Default</span><span style="color: #0000ff">></span> |
1 |
<span style="color: #606060" id="lnum3"> 3:</span> <span style="color: #0000ff"><</span><span style="color: #800000">CHOICES</span><span style="color: #0000ff">></span> |
1 |
<span style="color: #606060" id="lnum4"> 4:</span> <span style="color: #0000ff"><</span><span style="color: #800000">CHOICE</span><span style="color: #0000ff">></span>Option 1<span style="color: #0000ff"></</span><span style="color: #800000">CHOICE</span><span style="color: #0000ff">></span> |
1 |
<span style="color: #606060" id="lnum5"> 5:</span> <span style="color: #0000ff"><</span><span style="color: #800000">CHOICE</span><span style="color: #0000ff">></span>Option 2<span style="color: #0000ff"></</span><span style="color: #800000">CHOICE</span><span style="color: #0000ff">></span> |
1 |
<span style="color: #606060" id="lnum6"> 6:</span> <span style="color: #0000ff"><</span><span style="color: #800000">CHOICE</span><span style="color: #0000ff">></span>Option 3<span style="color: #0000ff"></</span><span style="color: #800000">CHOICE</span><span style="color: #0000ff">></span> |
1 |
<span style="color: #606060" id="lnum7"> 7:</span> <span style="color: #0000ff"><</span><span style="color: #800000">CHOICE</span><span style="color: #0000ff">></span>New option<span style="color: #0000ff"></</span><span style="color: #800000">CHOICE</span><span style="color: #0000ff">></span> |
1 |
<span style="color: #606060" id="lnum8"> 8:</span> <span style="color: #0000ff"></</span><span style="color: #800000">CHOICES</span><span style="color: #0000ff">></span> |
1 |
<span style="color: #606060" id="lnum9"> 9:</span> <span style="color: #0000ff"></</span><span style="color: #800000">Field</span><span style="color: #0000ff">></span> |
Esto lo podemos hacer bien sencillo con LINQ to XML:
1 |
<span style="color: #606060" id="lnum1"> 1:</span> <span style="color: #008000">//Get SPFieldChoice from desired List</span> |
1 |
<span style="color: #606060" id="lnum2"> 2:</span> SPFieldChoice fieldChoice = GetChoiceColumn(); |
1 |
<span style="color: #606060" id="lnum3"> 3:</span>  |
1 |
<span style="color: #606060" id="lnum4"> 4:</span> <span style="color: #008000">//Parse SchemaXml property as XElement</span> |
1 |
<span style="color: #606060" id="lnum5"> 5:</span> XElement fieldXml = XElement.Parse(fieldChoice.SchemaXml); |
1 |
<span style="color: #606060" id="lnum6"> 6:</span>  |
1 |
<span style="color: #606060" id="lnum7"> 7:</span> <span style="color: #008000">//Create XElement node: <CHOICE>now</CHOICE></span> |
1 |
<span style="color: #606060" id="lnum8"> 8:</span> XElement choice = <span style="color: #0000ff">new</span> XElement(<span style="color: #006080">"CHOICE"</span>); |
1 |
<span style="color: #606060" id="lnum9"> 9:</span> choice.SetValue(<span style="color: #006080">"Added_"</span> + DateTime.Now.ToString()); |
1 |
<span style="color: #606060" id="lnum10"> 10:</span> <span style="color: #008000">//Get CHOICES node and Add new CHOICE node</span> |
1 |
<span style="color: #606060" id="lnum11"> 11:</span> fieldXml.Element(<span style="color: #006080">"CHOICES"</span>).Add(choice); |
1 |
<span style="color: #606060" id="lnum12"> 12:</span> <span style="color: #008000">//Update SchemaXml and Field</span> |
1 |
<span style="color: #606060" id="lnum13"> 13:</span> fieldChoice.SchemaXml = fieldXml.ToString(); |
1 |
<span style="color: #606060" id="lnum14"> 14:</span> fieldChoice.Update(); |
Y así, podemos añadir una nueva opción a nuestro campo SPFieldChoice en soluciones Sandbox.
Saludos!!
Deja un comentario