2009-06-10 6 views
5

Tengo un problema en una lista de SharePoint: algunos campos aparecen dos veces en el formulario de visualización, en el formulario de nuevo artículo y en la página de configuración de la lista. Ambos campos tienen la misma ID y la misma página de propiedades (misma URL), por lo que ocultar una oculta la otra.
Usando SharePoint Manager Solo puedo ver un campo, pero tal vez miré en los lugares equivocados? ¿Alguien ha experimentado algo similar y cómo puedo solucionar este problema?Sharepoint: el campo aparece dos veces en Ver/Nuevo elemento

Respuesta

4

No es aconsejable actualizar el xml que crea el tipo de contenido. Si desea agregar campos más adelante al tipo de contenido, hágalo a través de una nueva función, consulte este enlace.

MSDN Article

Nota el siguiente texto

Bajo ninguna circunstancia deberá actualizar el archivo de definición de tipo de contenido para un tipo de contenido después de haber instalado y activado ese tipo de contenido. Windows SharePoint Services no realiza un seguimiento de los cambios realizados en el archivo de definición de tipo de contenido. Por lo tanto, no tiene ningún método para reducir los cambios realizados en los tipos de contenido del sitio a los tipos de contenido secundarios. Para obtener información sobre las mejores prácticas al realizar cambios en los tipos de contenido que se han instalado y activado, consulte Actualización de tipos de contenido.

+0

El problema existía en la producción, y teníamos datos reales. Creamos nuevas columnas y les copiamos los datos, y eliminamos las columnas duplicadas. Entonces, de alguna manera, tu solución es lo que hicimos, nada. :-) – Kobi

5

Yepp, he tenido esos problemas trabajando con tipos de contenido agregados a las listas. Cuando realicé actualizaciones sobre los tipos de contenido de alguna manera, a veces obtuve duplicados. Cuando los he visto, parecen ser los mismos Id. Y Nombres, pero la identificación es realmente diferente.

La solución que he usado (funciona con los tipos de contenido al menos) es comparar los enlaces de campo en los tipos de contenido del sitio con los enlaces de campo en el archivo xml real (función) que contiene el tipo de contenido. Si no son la misma cantidad de enlaces de campo ... tome medidas para eliminar los duplicados.

+0

Hola Johan, gracias! Tiene toda la razón, por cierto, este es un tipo de contenido agregado a la lista por una función (no la mía, sin embargo). ¿Dónde puedo encontrar estos enlaces de campo? ¿Se hace programáticamente? – Kobi

+0

Me refiero a si los conoce. Enlaces a los campos utilizados en el tipo de contenido. Como no tiene acceso a la función real, recomendaría la solución de Colin en este caso. Mi solución no es realmente compatible, pero lo que es de todos modos ... en SharePoint tenemos que sortear los obstáculos de todos modos podemos ... :-) –

7

Tengo el mismo problema, después de agregar la columna en la definición de la lista, comienzan a aparecer dos veces en los formularios nuevos/editar/ver elementos. Acabo de cambiar el orden de las columnas en la configuración de la lista y el problema fue resuelto.

+2

Solución interesante, gracias. De hecho, sé de varios problemas en SharePoint que pueden resolverse exactamente por eso ... – Kobi

2

Usar este comando de PowerShell para limpiar dublicates:

Clear-Host 
Add-PSSnapin microsoft.sharepoint.powershell -ErrorAction SilentlyContinue 
[System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c") 

$web=Get-SPWeb "http://weburl.here" 

function cleanFieldLinks($listName){ 
    $list = $web.GetList($listName) 
    $ct = $list.ContentTypes[0]; 

    $flDub = $ct.FieldLinks | group-object DisplayName | where { $_.Count -gt 1 } 

    foreach($fl in $flDub) { 
     $skipFirst = $fl.Group | select-object -skip 1 

     foreach($flDel in $skipFirst){ 
      $ct.FieldLinks.Delete($flDel.Id) 
     } 
    } 
    $ct.Update() 

} 

cleanFieldLinks("lists/listurl") 
$web.Dispose() 
2

1) En primer lugar, quería mencionar que me encontré con este tema ya que estaba trabajando para hacer que mi paquete de soluciones de MOSS 2007 compatible con MOSS 2013. MOSS 2013 no parece gustarles los nombres de campo duplicados. Entonces, si tiene campos personalizados que tienen el mismo nombre que un campo que viene con MOSS 2013, obtendrá un error de nombre de campo duplicado.

2) Esto me obligó a tener que volver y actualizar mis campos personalizados y tipos de contenido. Me encontré con el problema por el que mis nombres de campo aparecían varias veces después de realizar los cambios en los campos personalizados que causaban el problema del nombre de campo duplicado.

3) Escribí una página de formularios web para resolver el problema de que el campo aparezca varias veces en su vista, nuevo y modifique formularios. Simplemente tendrá que modificar el código para especificar la lista que desea verificar. Esta versión eliminará la primera instancia de fieldref y conservará la segunda instancia:

using System; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
//using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
//using System.Xml.Linq; 

using Microsoft.SharePoint; 

using System.Text; 
using System.Collections.Generic; 



public partial class FixDuplicateFieldIssue : Microsoft.SharePoint.WebControls.LayoutsPageBase 
{ 



    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (SPContext.Current.Web.CurrentUser == null) 
     { 
      Response.Write("You must be logged in to view this page."); 
      Response.End(); 
      return; 

     } 
     if (!SPContext.Current.Web.DoesUserHavePermissions(SPBasePermissions.ManageWeb)) 
     { 
      Response.Write("You do not have permissions to view this page."); 
      Response.End(); 
      return; 
     } 

     lblOutput.Text = ""; 

     StringBuilder sbOutput = new StringBuilder(); 

     using (SPSite site = new SPSite(SPContext.Current.Site.ID)) 
     { 
      using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID)) 
      { 
       try 
       {  
        hlBack.NavigateUrl = web.Url; 

        //open the List **** SPECIFY THE LISTNAME HERE *** 
        SPList spList = web.Lists["LISTNAME"]; 
        if (spList != null) 
        { 
         //Check FieldLinks 

         sbOutput.Append("<table border='1'>"); 

         foreach (SPContentType ct in spList.ContentTypes) 
         { 
          sbOutput.Append("<tr>"); 
          sbOutput.Append("<td>" + ct.Name + "</td>"); 
          sbOutput.Append("<td>"); 

          Dictionary<string, Guid> GuidDictionary = new Dictionary<String, Guid>(); 
          List<Guid> RepeatList = new List<Guid>(); 
          //SEARCH THE CONTENT TYPE FOR REPEAT SPFieldLinks 
          foreach (SPFieldLink spfl in ct.FieldLinks) 
          { 
           if (!GuidDictionary.ContainsKey(spfl.Name.ToLower())) 
           { 
            GuidDictionary.Add(spfl.Name.ToLower(), spfl.Id); 
           } 
           else if (GuidDictionary[spfl.Name.ToLower()].ToString().ToLower()!=spfl.Id.ToString().ToLower()) 
           { 
            //Record the GUID of the repeat SPFieldLink you want to delete in the RepeatList. In this case, we're recording the first item. If you want to delete the second one, add the spfl.Id instead. 
            RepeatList.Add(GuidDictionary[spfl.Name.ToLower()]); 
            sbOutput.Append("<span style='color:red;'>*</span>"); 
           } 

           sbOutput.Append(spfl.Name + "," + spfl.Id + "," + spfl.DisplayName +"<br />"); 

          } 
          sbOutput.Append("</td>"); 

          sbOutput.Append("<td>"); 
          sbOutput.Append("Repeats found: " + RepeatList.Count + "<br />"); 

          //DELETE THE Repeat Field Links 
          foreach (Guid idToDelete in RepeatList) 
          { 

           sbOutput.Append("Deleting FieldRef with ID= " + idToDelete.ToString() + "<br />"); 
           web.AllowUnsafeUpdates = true; 
           ct.FieldLinks.Delete(idToDelete); 
           ct.Update(); 
           web.AllowUnsafeUpdates = false; 

          } 
          sbOutput.Append("</td>"); 




          sbOutput.Append("</tr>"); 
         } 
         sbOutput.Append("</table>"); 





        } 
       } 
       catch (Exception ex) 
       { 
        sbOutput.Append("Error Occurred: " + ex.ToString()); 
       } 

      } 
     } 
     lblOutput.Text = sbOutput.ToString(); 

    } 
} 
+0

esto es solo un loco, fu * k Micro $ oft – krtek

Cuestiones relacionadas