2009-06-10 2 views
5

SharePoint 목록에 문제가 있습니다. 일부 필드는 표시 양식, 새 항목 양식 및 목록 설정 페이지에 두 번 나타납니다. 두 필드 모두 동일한 ID와 동일한 속성 페이지 (동일한 URL)를가집니다. 따라서 숨기는 것은 다른 것을 숨 깁니다.
사용 SharePoint Manager 하나의 필드 만 볼 수는 있지만 잘못된 장소를 보았을까요? 비슷한 경험을 한 사람이 있습니까? 어떻게이 문제를 해결할 수 있습니까?Sharepoint -보기/새 항목에 필드가 두 번 나타납니다.

답변

4

콘텐츠 형식을 만드는 xml을 업데이트하지 않는 것이 좋습니다. 나중에 콘텐츠 유형에 필드를 추가하려면 새로운 기능을 통해이 링크를 참조하십시오. 설치 및 콘텐츠 형식을 활성화 한 후

MSDN Article

주 어떠한 경우에도 다음과 같은 텍스트

당신은 콘텐츠 유형에 대한 콘텐츠 형식 정의 파일을 업데이트해야합니다. Windows SharePoint Services는 콘텐츠 형식 정의 파일의 변경 내용을 추적하지 않습니다. 따라서 사이트 콘텐츠 형식의 변경 내용을 하위 콘텐츠 형식으로 푸시 다운 할 수있는 방법이 없습니다. 설치되고 활성화 된 콘텐츠 형식을 변경할 때 유용한 정보에 대한 자세한 내용은 콘텐츠 형식 업데이트를 참조하십시오.

+0

문제는 생산 단계에 존재하며 실제 데이터가있었습니다. 우리는 새로운 컬럼을 생성하고 그 컬럼에 데이터를 복사하고 중복 된 컬럼을 삭제했습니다. 그래서, 당신의 해결책은 우리가 한 것입니다. :-) – Kobi

5

Yepp, 나는 목록에 추가 된 contenttypes로 작업하는 이러한 문제가있었습니다. contenttypes에 대한 업데이트를 만들었을 때 어떻게 든 복제본을 얻었습니다. 내가 그들을 보았을 때 그들은 똑같은 이드와 이름 인 것 같지만 이드는 실제로 다르다.

적어도 contenttypes와 함께 작동하는 솔루션은 사이트 contenttypes의 fieldlinks를 contenttype이 포함 된 실제 xml 파일 (기능)의 fieldlinks와 비교하는 것입니다. 필드 링크 수가 같지 않으면 ... 중복을 제거하는 조치를 취하십시오.

+0

안녕하세요 요한, 감사합니다! 당신은 절대적으로 옳습니다, btw, 이것은 내용에 의해 목록에 추가 된 콘텐츠 유형입니다 (제 생각에는 아닙니다). 이 필드 링크는 어디에서 찾을 수 있습니까? 프로그래밍 방식으로 완료 되었습니까? – Kobi

+0

알 경우 을 의미합니다. contenttype에 사용 된 필드에 대한 링크입니다. 실제 기능에 액세스 할 수 없기 때문에 필자는이 경우 Colin 's 솔루션을 권장합니다. 내 솔루션은 실제로 지원되지 않지만 어쨌든 ... SharePoint에서 우리는 장애물을 피해 갈 필요가 있습니다. :-) –

7

나는 목록 정의에 열을 추가 한 후 같은 문제가 발생하면 새/편집 /보기 항목 양식에 두 번 나타나기 시작합니다. 목록 설정에서 열 순서를 변경했는데 문제가 해결되었습니다. dublicates를 청소

+2

흥미로운 해결 방법입니다. 감사합니다. 나는 실제로 그 문제를 해결할 수있는 SharePoint의 몇 가지 문제에 대해 알고 있습니다 ... – Kobi

2

사용이 파워 쉘 스크립트 :

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) 먼저, 나는 MOSS 2013 MOSS 내 MOSS 2007 솔루션 패키지 호환 만들기 위해 노력했다 나는이 문제를 건너 온 것을 언급하고 싶었다 2013 년은 중복 된 필드 이름을 좋아하지 않는 것 같습니다. 따라서 MOSS 2013과 함께 제공되는 필드와 동일한 이름을 가진 사용자 지정 필드가있는 경우 중복 된 필드 이름을 찾지 못했습니다. 오류가 발생합니다.

2) 이로 인해 내 사용자 지정 필드와 콘텐츠 형식이 다시 업데이트되어야합니다. 중복 된 필드 이름 문제를 일으키는 사용자 지정 필드를 변경 한 후에 내 필드 이름이 여러 번 나타나는 문제를 보았습니다.

3) 웹 양식 페이지를 작성하여보기, 새로 작성 및 양식에서 필드를 여러 번 표시하는 문제를 해결했습니다. 확인하려는 목록을 지정하기 위해 코드를 수정해야합니다. 이 버전은 fieldref의 첫 번째 인스턴스를 삭제하고 두 번째 인스턴스를 유지합니다.

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

이것은 단지 미친 사람, fu * k입니다. Micro $ oft – krtek

관련 문제