2014-01-13 3 views
0

Мы пытаемся создать пользовательскую форму с помощью поля FieldRenderingControl. Все в порядке, пока мы не попробуем новую форму в списке, который отсутствует в корневом сайте.Ошибка с пользовательской формой и FieldRenderingControl

Так новые/редактирования для list1 на сайте/(работы)

редактировать для list2 на сайте/сайты/тестовый сайте (работы) новые для list2 на сайте/сайтах/тестовый сайте (не работает)

Ошибка, которую мы видим в журналах uls: «Список не существует. Выбранная страница содержит список, который не существует. Возможно, он был удален другим пользователем».

Вот код, который мы используем:

foreach (SPField f in listOfFields) // cType.Fields) 
    { 
     var field = f; 

     if (item != null) 
      field = item.Fields.GetFieldByInternalName(field.InternalName); 

     string uniqueid = field.Id.ToString().Replace("-", "_"); 
     if (!(field.FieldRenderingControl is TaxonomyFieldControl)) 
     { 
      var editControl = field.FieldRenderingControl; 
      editControl.ID = "fld_" + uniqueid; // fix for Lookup picker 
      editControl.FieldName = field.InternalName; 

      //edit mode if id is provided 
      if (item != null) 
      { 
       editControl.ControlMode = SPControlMode.Edit; 
       editControl.ItemId = item.ID; 

       var context = SPContext.GetContext(HttpContext.Current, item.ID, list.ID, web); 
       editControl.RenderContext = context; 
       editControl.ItemContext = context; 
      } 
      else 
      { 
       editControl.ControlMode = SPControlMode.New; 

       var context = SPContext.GetContext(HttpContext.Current, list.DefaultView.ID, list.ID, web); 
       editControl.RenderContext = context; 
      } 

      editControl.ListId = list.ID; 

      this.pnlControls.Controls.Add(new System.Web.UI.WebControls.Label 
      { 
       ID = "lbl_" + uniqueid, 
       Text = field.Title 
      }); 
      this.pnlControls.Controls.Add(editControl); 
     } 
    } 

Я могу предоставить больше кода, если это необходимо. Любая помощь приветствуется.

Спасибо.

Edit - Из ULS Логи

«Список не существует Страница выбран содержит список, который не существует, он может быть удален другим пользователем...»

Stack Trace: 
System.NullReferenceException: Object reference not set to an instance of an object. 
at Microsoft.SharePoint.SPContext.GetContentTypeThroughQueryString(String strIdx)  
at Microsoft.SharePoint.SPContext.get_ContentTypes()  
at Microsoft.SharePoint.SPContext.ContentTypeInternal(String contentTypeId)  
at Microsoft.SharePoint.SPContext.get_Fields()  
at Microsoft.SharePoint.WebControls.FieldMetadata.get_Field()  
at Microsoft.SharePoint.WebControls.TextField.CreateChildControls()  
at System.Web.UI.Control.EnsureChildControls()  
at Microsoft.SharePoint.WebControls.BaseFieldControl.OnLoad(EventArgs e)  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Control.LoadRecursive()  
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)cc 
+0

Обеспечить полную проверку стека ошибки для лучшего анализа. –

ответ

0

Оказывается, мне нужно было добавить SPControlMode.New в контекст, а также в FieldRenderingControl.

Я изменил код на следующий, который теперь работает.

var isNewItem = item == null; 

if (isNewItem) item = list.AddItem(); 

foreach (var f in listOfFields) // cType.Fields) 
{ 
    var field = f; 

    if (!isNewItem) 
     field = item.Fields.GetFieldByInternalName(field.InternalName); 

    string uniqueid = field.Id.ToString().Replace("-", "_"); 
    if (!(field.FieldRenderingControl is TaxonomyFieldControl)) 
    { 
     var editControl = field.FieldRenderingControl; 
     editControl.ID = "fld_" + uniqueid; // fix for Lookup picker 
     editControl.FieldName = field.InternalName; 

     //edit mode if id is provided 
     if (!isNewItem) 
     { 
      editControl.ControlMode = SPControlMode.Edit; 
      editControl.ItemId = item.ID; 

      var context = SPContext.GetContext(HttpContext.Current, item.ID, list.ID, web); 
      editControl.RenderContext = context; 
      editControl.ItemContext = context; 
     } 
     else 
     { 
      editControl.ControlMode = SPControlMode.New; 
      editControl.ItemId = item.ID; 

      var context = SPContext.GetContext(HttpContext.Current, item.ID, list.ID, web); 
      context.FormContext.FormMode = SPControlMode.New; 
      editControl.RenderContext = context; 
      editControl.ItemContext = context; 
     } 

     editControl.ListId = list.ID; 

     this.pnlControls.Controls.Add(new System.Web.UI.WebControls.Label 
     { 
      ID = "lbl_" + uniqueid, 
      Text = field.Title 
     }); 
     this.pnlControls.Controls.Add(editControl); 
    } 
} 
0

, так как он работает для редактирования формы на сайте/сайтах/тестового сайта не существует никаких причин, он не должен найти список в новой форме, более подробную информацию и контекст необходим здесь, если вы можете ....

Смежные вопросы