Использование FieldRendingControl для данного типа контента

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/38000

  •  09-12-2019
  •  | 
  •  

Вопрос

Я создаю веб-панель, который действует как новая форма.Исходя из представления, я получаю на полях и рендеринг их в моем веб-панели, используя SPFIELD.FieldrenderingControl.

Мои столбцы - это столбцы сайта, на этом уровне некоторые были необходимы, добавляются в тип содержимого, который был добавлен в список.После добавления в список определенные столбцы, которые не были необходимы, не требуются, а некоторые, которые были необходимы на уровне столбца сайта, теперь нет.

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

Я поставил комментарии в коде вокруг области, я думаю, может потребоваться поправки.

                try
                {
                    Table table = new Table();
                    table.CssClass = "hlwp_DSCreateEditTable";
                    TableRow row;
                    TableCell cell;
                    SPContentType ct = spList.ContentTypes[ContentTypeName];


                for (int i = 0; i < spView.ViewFields.Count; i++)
                {
                    string fieldName = spView.ViewFields[i];
                    //The flink holds the information at the content type level in the list.
                    SPFieldLink flink = ct.FieldLinks[fieldName];
                    SPField field = spList.Fields.GetField(fieldName);

                    row = new TableRow();
                    row.CssClass = "hlwp_DSCreateEditRow";
                    cell = new TableCell();
                    cell.CssClass = "hlwp_DSCreateEditTitleCell";



    //Even tried setting the field.required to match the flink.required.
    //When debugging and following the code through it stays the same as flink.required, 
    //but if you call Page.Validate() it displays errors on the controls 
    //that are required at the site column level not list content type level.

                    if (flink != null)
                    {
                        field.Required = flink.Required;
                    }

                    if (field.Required)
                    {
                        cell.Text = field.Title + "<font color='red'>*</font>";
                    }
                    else
                    {
                        cell.Text = field.Title;
                    }

                    row.Cells.Add(cell);
                    cell = new TableCell();
                    cell.CssClass = "hlwp_DSCreateEditControlCell";
                    Control cntrl = HelperClass.GetSharePointControls(field, spList, itemId);
                    if (cntrl == null) continue;
                    cell.Controls.Add(cntrl);
                    row.Cells.Add(cell);
                    table.Rows.Add(row);

                }
.

helperclass.getsharepointControls

public static Control GetSharePointControls(SPField field, SPList list, int itemId)
        {
          // check if the field is a buildIn field, or can be rendered by a SharePoint Control
            if (field == null || field.FieldRenderingControl == null || field.Hidden) return null;

        Control ctrl = null;
        SPControlMode mode = SPControlMode.Invalid;

        if (itemId > 0)
            mode = SPControlMode.Edit;
        else
            mode = SPControlMode.New;

//Wondering if it's something to do with the context, as later on you set this context to the RenderingContext.
            var controlContext = SPContext.GetContext(System.Web.HttpContext.Current, itemId, list.ID, SPContext.Current.Web);



        SPContext.Current.FormContext.SetFormMode(mode, true);
        controlContext.FormContext.SetFormMode(mode, true);


        try
        {
                BaseFieldControl webControl = field.FieldRenderingControl;
                webControl.ListId = list.ID;
                webControl.ControlMode = mode;
                webControl.ItemId = itemId;
                webControl.FieldName = field.Title;
                webControl.ID = GetControlID(field); //Creates a unique ID.

                webControl.RenderContext = controlContext;
                webControl.ItemContext = controlContext;

                ctrl = webControl;
            }
            return ctrl;
        }
        catch (Exception ex)
        {
            var errorLabel = new Label
            {
                ID = "ErrorLabel",
                Text = String.Format("Error in GetSharePointControls:<br/>{0}", ex)
            };
            return errorLabel;
        }
    }
.

Если у кого-то есть идеи, я был бы очень благодарен.Я даже попытался подумать о Microsoft Code с ограниченным успехом.

Это было полезно?

Решение 2

Я посмотрел дальше в это, и кажется, что SPFIELD прочитает в необходимом состоянии поля списка. Однако в пользовательском списке вы можете редактировать необходимое поле, нажав на имя столбца в настройках списка.

Для библиотеки документов требуемая настройка поля отсутствует. Единственный способ установить требуемое поле, либо в типе содержимого сайта и нажимает изменение, (которое изменило бы необходимое поле везде, которое вы используете его, а не только в данном списке), либо вы, используя .NET или PowerShell Чтобы установить поле в список для необходимости. Затем удалите любую ссылку в свой оригинальный код в SPFIELDLink.

$web = Get-SPWeb "[YourSite]"
$list = $web.GetListFromUrl("[Your List URL]")
$field = $list.Fields["[Field Name"]
Write-Host "Previous Value:" $field.Required
$field.Required = $true
$field.Update()
Write-Host "The field" $field.Title "is now set to" $field.Required
.

Странно, как оригинальный код, который я опубликовал, действует очень разные в пользовательском списке по сравнению с библиотекой документов.

Я обнаружил это, отобразите описание поля в моем веб-панель. Если локальное описание было отличным для описания столбца сайта, когда вы вызываете поле. Что означало позвонить SPField из списка, дал вам значения из столбца, указанного в списке, а не из столбца сайта. Поэтому я питал запрос, если был необходим столбец в списке, и хотя он был в столбце сайта, это не было для списка.

Альтернативное решение вместо использования PowerShell - создать страницу макета, которые вы звоните из настроек библиотеки, позволяющие изменять необходимое значение для каждого из столбцов в списке, так как ясно, что Microsoft пропустил эту функцию. (Может быть, по причинам, по которой я еще не нашел).

Другие советы

Может быть, просмотреть, как Batchedit проект CodePlex делает это: http://sp2010batchedit.codeplex.com/ / P >.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top