Использование FieldRendingControl для данного типа контента
-
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 >.