2009-06-10 5 views
5

Ho un problema in un elenco di SharePoint: alcuni campi compaiono due volte sul modulo Visualizza, sul modulo Nuovo elemento e sulla pagina delle impostazioni dell'elenco. Entrambi i campi hanno lo stesso ID e la stessa pagina di proprietà (stesso URL), quindi nascondere uno nasconde l'altro.
Utilizzo di SharePoint Manager Posso vedere solo un campo, ma forse ho guardato nei posti sbagliati? Qualcuno ha riscontrato qualcosa di simile e come posso risolvere questo problema?Sharepoint - Il campo viene visualizzato due volte su Visualizza/Nuovo elemento

risposta

4

Non è consigliabile aggiornare il xml che crea il tipo di contenuto. Se vuoi aggiungere campi in un secondo momento al tipo di contenuto, fallo attraverso una nuova funzione, guarda questo link.

MSDN Article

Nota il seguente testo di

In nessun caso si aggiornare il file di definizione del tipo di contenuto per un tipo di contenuto dopo aver installato e attivato tale tipo di contenuto. Windows SharePoint Services non tiene traccia delle modifiche apportate al file di definizione del tipo di contenuto. Pertanto, non esiste un metodo per eliminare le modifiche apportate ai tipi di contenuto del sito ai tipi di contenuto figlio. Per informazioni sulle migliori pratiche quando si apportano modifiche ai tipi di contenuto che sono stati installati e attivati, vedere Aggiornamento dei tipi di contenuto.

+0

Il problema esisteva sulla produzione e avevamo dati reali. Abbiamo creato nuove colonne e abbiamo copiato i dati su di esse e abbiamo eliminato le colonne duplicate. Quindi, in un certo senso, la tua soluzione è ciò che abbiamo fatto - niente. :-) – Kobi

5

Yepp, ho avuto questi problemi lavorando con contenttypes aggiunti agli elenchi. Quando ho fatto aggiornamenti sui tipi di contenuto, in qualche modo, a volte ho ottenuto duplicati. Quando li ho guardati sembrano essere gli stessi Ids e Nomi ma l'id è in realtà diverso.

La soluzione che ho utilizzato (funziona almeno con contenttype) è quella di confrontare i collegamenti di campo sul contenttype del sito con i collegamenti di campo nel file xml effettivo (funzionalità) che contiene il tipo di contenuto. Se non sono lo stesso numero di collegamenti di campo ... prendi provvedimenti per rimuovere i duplicati.

+0

Ciao Johan, grazie! Hai assolutamente ragione, btw, questo è un tipo di contenuto aggiunto alla lista da una funzione (non mia, però). Dove posso trovare questi link? È fatto programmaticamente? – Kobi

+0

Voglio dire se li conosci. Link ai campi utilizzati nel tipo di contenuto. Dato che non si ha accesso alla funzione reale, raccomanderei la soluzione di Colin in questo caso. La mia soluzione non è realmente supportata, ma in ogni caso ... in SharePoint abbiamo bisogno di aggirare gli ostacoli in ogni caso ... :-) –

7

Ho lo stesso problema, dopo aver aggiunto la colonna nella definizione dell'elenco, iniziano a comparire due volte in nuovi/modifica/visualizza i moduli oggetto. Ho appena cambiato l'ordine delle colonne nelle impostazioni dell'elenco e il problema è stato risolto.

+2

Soluzione interessante, grazie. In realtà so di diversi problemi in SharePoint che possono essere risolti esattamente da quello ... – Kobi

2

Usa questo script PowerShell per pulire 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) In primo luogo, ho voluto dire che mi sono imbattuto in questo problema come stavo lavorando per rendere il mio pacchetto soluzione MOSS 2007 compatibile con MOSS 2013. MOSS Il 2013 non sembra gradire i nomi di campi duplicati. Quindi se hai campi personalizzati che hanno lo stesso nome di un campo che viene fornito con MOSS 2013, otterrai un errore nel nome del campo duplicato.

2) Questo mi ha costretto a tornare indietro e aggiornare i miei campi personalizzati e tipi di contenuto. Mi sono imbattuto nel problema in cui i nomi dei miei campi venivano visualizzati più volte dopo aver apportato le modifiche ai campi personalizzati che causavano il problema del nome del campo duplicato.

3) Ho scritto una pagina di moduli Web per risolvere il problema di visualizzare il campo più volte nella visualizzazione, nuovo e modifica moduli. Dovrai solo modificare il codice per specificare la lista che vuoi controllare. Questa versione eliminerà la prima istanza di fieldref e manterrà la seconda istanza:

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

questo è solo un uomo pazzo, fu * k Micro $ oft – krtek