2010-01-14 4 views
1

실패의 listItem.Update는 NullReferenceException이 실패 객체의 현재 상태로 인해 유효하지 않습니다. "SPListItem.Update는 다음 코드 블록을 사용하여

예, 그렇기 때문에 나는 빗어 봤습니다. 성공없이 많은 순열을 시도했습니다.

아이디어가 있으십니까?

업데이트 : 첫 번째 코멘트 후, 나는 그것이 더 나은 지냈다 있는지 확인하기 위해 코드에서 익명 대리자를 제거하려 :

// store the selected item to pass between methods 
    public T SelectedItem { get; set; } 

    // set the selected item and call the delegate method 
    public virtual void Save(T item) 
    { 
     SelectedItem = item; 
     try 
     { 
      SPSecurity.RunWithElevatedPrivileges(SaveSelectedItem); 
     } 
     catch 
     { 
     } 
    } 

    public virtual void SaveSelectedItem() 
    { 
     if (SelectedItem != null) 
     { 

      using (SPSite site = new SPSite(this.SiteUrl)) 
      { 
       using(SPWeb web = site.OpenWeb()) 
       {      
        SPList list = web.Lists[this.ListName]; 
        SPListItem listItem = list.Items.Add(); 
        //UpdateListItem(listItem, SelectedItem); 
        listItem["Background"] = "foo"; 
        listItem.Update(); 
       } 
      }  
     } 
    } 

그리고이 계속 실패 "작업으로 인해 현재에 유효하지 않습니다 개체의 상태. " 두 코드 샘플 모두 site.Impersonating이 false 인 것 같습니다. Windows 인증 및 가장을 web.config에 사용하고 있습니다. 이것은 ASP.Net 개발 서버에서 실행 중입니다.

답변

1

이 사이트 (blackninjasoftware)에서 예제를 발견했습니다. 사이트에 대한 참조를 만들고 SystemAccount 토큰을 가져 와서 관리자 토큰을 사용하여 사이트에 대한 다른 참조를 만듭니다. 처음에는 조금 익숙하지 않은 것 같았습니다.하지만 헤이 - 마감 기한이 있습니다.

최종 작업 방법의 몸은 지금과 같이 보인다 :

  SPListItem new_item = null; 
      SPSite initialSite = new SPSite(this.SiteUrl); 
      using (var site = new SPSite(this.SiteUrl, initialSite.SystemAccount.UserToken)) 
      { 
       // This code runs under the security context of the SHAREPOINT\system 
       // for all objects accessed through the "site" reference. Note that it's a 
       // different reference than SPContext.Current.Site. 
       using (var elevatedWeb = site.OpenWeb()) 
       { 
        elevatedWeb.AllowUnsafeUpdates = true; 
        SPList list = elevatedWeb.Lists[this.ListName]; 
        new_item = list.Items.Add(); 
        UpdateListItem(new_item, item); 
        if (new_item != null) 
        { 
         new_item.Update(); 
        } 
       } 
      } 
      initialSite.Dispose(); 
관련 문제