Развертывание веб-части ListViewByQuery застряло на фразе «Работаем над этим…»
-
10-12-2019 - |
Вопрос
я использую ListViewByQuery
в пользовательской веб-части.Если я установлю CAML GroupBy
к <GroupBy Collapse='FALSE'>
(т.е.развернуто), веб-часть работает нормально.Однако, если я установлю его на <GroupBy Collapse='TRUE'>
, элемент развернется, но затем зависнет на сообщении «Работаем над этим...»:
(Я полагаю, что старое сообщение в SharePoint 2010 было «Загрузка...»).
Вот рабочая копия в предварительно развернутом виде:
Похоже, это не проблема JavaScript (проверено в нескольких браузерах).
Как это исправить?
В стороне:Карин упоминает очень похожую проблему в своем блоге, используя ListViewByQuery
Веб-часть здесь.Я проверю предлагаемое исправление JavaScript и сообщу об этом, но считаю, что это всего лишь обходной путь. Какова основная причина и решение?
Обновлять:Я не могу заставить работать исправление JS.Я динамически генерирую ListViewByQuery
управление в моей пользовательской веб-части (как казалось бы, необходимо), и хотя JS, кажется, срабатывает, я не могу определить, как его отладить.
Обновление 2:Наконец-то исправление JS заработало - свертывание вызывалось дважды (так что оно снова просто расширялось).Вскоре я предложу это как возможный ответ, но не приму его как реальный ответ.
Решение
Вот так у меня заработало исправление/кудж JavaScript.Во-первых, необходимо предварительно расширить ListViewByQuery
Группа CAML (Collapse='FALSE'
).Во-вторых, предлагаемый JavaScript запускается дважды и просто сворачивает/разворачивает результат, поэтому в 2013 году он, похоже, не работает.Итак, вот как я начал работать:
Я создаю ListViewByQuery
управлять динамически (по мере необходимости/рекомендовано в документации):
Panel pnlDiv = new Panel();
pnlDiv.ID = "pnlDiv";
pnlDiv.CssClass = "ms-authoringcontrols";
ListViewByQuery lvPdfs = new ListViewByQuery();
..
EnsureChildControls();
pnlDiv.Controls.Add(lvPdfs);
pnlDiv.RenderControl(writer);
RenderChildren(writer);
Поскольку у меня были проблемы с JavaScript, я создал его на стороне сервера:
private void RegisterExpandJavascriptFix()
{
ClientScriptManager cs = Page.ClientScript;
if (!cs.IsClientScriptBlockRegistered(this.GetType(), "CollapseFunc"))
{
cs.RegisterClientScriptBlock(this.GetType(), "CollapseFunc", JSExpandFix, true);
}
if (!cs.IsStartupScriptRegistered(this.GetType(), "Collapse"))
{
cs.RegisterStartupScript(this.GetType(), "CollapseFunc", "collapseDiv();", true);
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
RegisterExpandJavascriptFix();
}
}
А вот JavaScript:
private const string JSExpandFix = @"function collapseDiv() {
var div = document.getElementById('pnlDiv');
//alert(div);
if (div != null) {
var links = div.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
if (links[i].href == 'javascript:' && links[i].onclick.toString().indexOf('ExpCollGroup') > -1 && links[i].previousSibling.tagName == 'IMG') {
//alert(links[i].onclick.toString());
links[i].click();
}
}
}
}";
Обратите внимание links[i].previousSibling.tagName == 'IMG')
проверьте - это всего лишь мой способ убедиться, что он нажимает только на первый свернуть ссылку (т.е.изображение плюс/минус, а не текст).