Pregunta

Tengo una herramienta para actualizar todos los elementos en SP (reemplazo de enlaces). La herramienta funciona la mayor parte del tiempo, pero a veces me arroja un ArgumentException ("Valor no se encuentra dentro del rango esperado.").

Aquí está el código cómo itero e intente acceder al valor:

   foreach (SPList list in web.Lists)
   {
         foreach (SPListItem item in list.Items)
         {
              foreach (SPField field in list.Fields)
              {
                   if (!field.ReadOnlyField)
                   {
                       if (item.Fields.Contains(field.Id) && item[field.Id] != null)
                       {

La excepción se lanza a item[field.Id] Y no veo por qué. El campo está claramente en la colección de campos de elementos como la item.Fields.Contains(field.Id) devoluciones true. También, por supuesto, el campo.id es un guía normal.

¿Estoy cometiendo un error lógico aquí?

¿Fue útil?

Solución

He tenido éxito al no usar .id, pero usando internalName con .containsfieldwithstaticName (). También reviso oculto y puedo en el campo, ya que estos son más campos del sistema y no personalizados, por lo que no estoy preocupado por ellos.

Muestra a continuación

SPWeb web = SPContext.Current.Web;
foreach (SPList list in web.Lists)
{
    foreach (SPListItem item in list.Items)
    {
        foreach (SPField field in item.Fields)
        {
           if(!field.Hidden && !field.CanBeDeleted && item.Fields.ContainsFieldWithStaticName(field.StaticName) && item.GetFormattedValue(field.InternalName) != null)
            {
                //CODE HERE
            }                        
        }

Otros consejos

Recientemente tuve este problema yo mismo; La única diferencia es que estaba usando una consulta CAML. Si su código anterior está resumido y usted también, esto puede ser útil para usted.

El problema redujo a dos problemas:

A) No había agregado una de las columnas a los visores XML, por lo que el campo no estaba en el Splistitem en absoluto.

b) Una vez que lo agregé, tuve que configurar mi nuevo atributo indocumentado favorito Nullable:

<FieldRef Name="Notes" Nullable="True"/>

Esto asegura que haya un null Entrada para campos vacíos (en lugar de no entrada), entonces item["Note"] no devolverá un NullReferenceException inmediatamente; permitido item["Note"] != null.

Es difícil decir por qué está obteniendo la excepción (algún problema de casting en alguna parte), pero he reelaborado dos líneas de su código que podrían ayudar:

  1. En lugar de iterar a través de todos los campos de la lista, iterar a través de todos los campos en el elemento de la lista

  2. Indexers es una pesadilla de excepción en C#, intente usar un método que siempre debe devolver algo y no arrojar excepciones (esa es la teoría de todos modos).

Aquí vamos:

    SPWeb web = SPContext.Current.Web;
    foreach (SPList list in web.Lists)
    {
        foreach (SPListItem item in list.Items)
        {
            foreach (SPField field in item.Fields)
            {
                if (item.Fields.Contains(field.Id) && item.GetFormattedValue(field.InternalName) != null)
                {
                    //CODE HERE
                }                        
            }

Encontré una solución al problema original que se publicó aquí, me llevó todo el día luchando con XML devuelto por consulta. La solución es, en los visores, terminar el nombre interno hasta 32 charachistas. Y luego, al obtener valor, use el nombre interno terminado hasta 32 caracteres.

Definitivamente, esto es un código mal probado por Microsoft presionado en SP 2010. Deben hacer un mejor trabajo probándolo.

Cualquier campo que tenga un nombre interno mayor de 32 es un problema si usa visualización. Si no usa visualización, es bueno, no hay problema.

Intente establecer el valor de aceleración de recursos para "Umbral de búsqueda de vistas de lista". Vaya al administrador central> Gestión de aplicaciones> Administrar aplicaciones web. Seleccione la aplicación web que debe cambiarse y luego vaya a Configuración general> Limitaciones de recursos.

Nota importante: siempre evalúe el impacto de cambiar los valores de umbral predeterminados en SharePoint y siempre tenga en cuenta la cantidad de columnas en sus listas.

Salud

Parece que recuerdo haber corrido a través de este también. Curiosamente, GUID no es el medio más confiable para obtener el valor de un artículo; El uso de Name o el título es mucho más predecible.

Si usa un indexador de cadena, verificará esa cadena contra el título, el nombre interno y el nombre estático para una coincidencia.

Splistitem.Item Propiedad (cadena)

¿Por qué GUID no funciona todo el tiempo? Microsoft lo sabe; Pero no lo están diciendo.

EDITAR: Mirando mis notas de confirmación, parece que cambié de ID a InternerName para mejorar la confiabilidad del 2007. Por lo tanto, esto puede o no ayudar con 2010.

Ante todo:

Reemplace su línea de código

foreach (SPListItem item in list.Items) 

con

SPListItemCollection items = l.Items;
foreach(SPListItem item in items)

Esa es una mejor práctica. Intente reemplazar su línea de código con la que se molesta con:

if (item.Fields.Contains(field.Id) && item.Fields[field.Id] != null)

No estoy seguro, pero es posible que en el indexador del elemento [], solo existan campos que contienen un valor, mientras que los campos posibles están en el elemento. Esto explica por qué item.fields contiene (id) Devuelve un valor y item.fields [id] devuelve un argumentoxception

Licenciado bajo: CC-BY-SA con atribución
scroll top