Создать динамический вид на веб-часть ListView
-
10-12-2019 - |
Вопрос
Я бросаю вызов этому требованию: Клиент
хочет показать только элементы списка в списке Веб-часть на основе значения из профиля пользователя, а также сохранить функциональность списка просмотра веб-части, такую как сортировка и фильтрация OB.Я делаю некоторые исследования, и вот мой поиск:
- .
- Я пытаюсь использовать тот же подход, что и перечислен в список здесь .Однако этот подход имеет один очень уродливый недостаток.Он переписывает представление на каждой странице Обновить и покидает запрос на вид на основе последнего пользователя профиля пользователя пользователя - не приемлемым.
Поэтому я хотел бы генерировать как View-The Fly для этой веб-части, а также применить на него запрос.Я не хотел бы редактировать оригинальный вид в списке.
Любые идеи, пожалуйста?
Решение
Итак, я решил его с помощью моей коллеги, на создании дочерних элементов управления, которые я выполняю.Возьмите схему XML с вида, перезаписать запрос и пропустите его в список представления.Новое представление не создано и все работает.
var obtainedList = elevatedWeb.GetListFromWebPartPageUrl(FullUrl);
if (obtainedList == null)
{
throw new Exception(string.Format(ListFromUrlNotObtained,FullUrl));
}
FullUrl = HttpUtility.UrlDecode(FullUrl);
var listViewWebPart = new ListViewWebPart();
listViewWebPart.WebId = elevatedWeb.ID;
listViewWebPart.ListId = obtainedList.ID;//.ToString("B").ToUpper();
var obtainedListView =obtainedList.Views.OfType<SPView>().FirstOrDefault<SPView>(lv => FullUrl.EndsWith(lv.Url));
if (obtainedListView == null)
{
throw new Exception(string.Format(ViewFromUrlNotObtained,FullUrl));
}
var html = obtainedListView.HtmlSchemaXml;
var xml = XElement.Parse(obtainedListView.HtmlSchemaXml);
xml.Attribute("Url").Remove();
xml.Element(XName.Get("Query")).SetValue(WildcardProcessor.ProcessQuery(FilterQuery));
var updatedXml = xml.ToString();
listViewWebPart.ListViewXml = updatedXml;
Controls.Add(listViewWebPart);
. Другие советы
Вы можете создавать просмотр динамически. Я не знаю, что «Клиент хочет показать только элементы списка в списке Веб-роль в зависимости от стоимости от профиля пользователя». Но вы можете проверить, чтобы вы могли бы предположить, чтобы представить названный «ClientView» в списке, если найдено его, и создать новый вид с тем же именем для текущего пользователя.
e.g.
SPList taskList = web.Lists[tasklistName];
string query = string.Empty;
if (taskList != null && taskList.ItemCount > 0)
{
query = "<OrderBy><FieldRef Name=\"Requirement_x0020_Details\" Ascending='TRUE'/></OrderBy><Where><Eq><FieldRef Name=\"Item_x0020_Type\"/><Value Type='Text'>Current</Value></Eq></Where>";
}
else
{
query = "<OrderBy><FieldRef Name=\"Requirement_x0020_Details\" Ascending='TRUE'/></OrderBy><Where><Eq><FieldRef Name=\"Task_x0020_Type\"/><Value Type='Text'>Current</Value></Eq></Where>";
}
StringCollection relevantColumns = CreateViewColumns();
SPView taskView = taskList.Views.Add("ClientView", relevantColumns, query, rowCount, true, false);
private StringCollection CreateViewColumns()
{
StringCollection viewFieldsCollection = new StringCollection();
string tasksColumns = "Requirement_x0020_Details;DocIcon;LinkTitle;AssignedTo;Status;Priority;DueDate;PercentComplete";
string[] columns = tasksColumns.Split(';');
foreach (string column in columns)
{
viewFieldsCollection.Add(column);
}
return viewFieldsCollection;
}
. Я не уверен, что это соответствует вашим требованиям, но не сможете это сделать из коробки с текущей веб-частью пользовательского фильтра.Он предоставляет данные профиля пользователя для текущего пользователя, а затем добавьте соединение в свой список, и он будет фильтровать.