Все видели диалоговые окна в SharePoint 2010. Но не все знают, как неправильно они работают!

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

В 2007 версии диалоговых окон не было и это было не очень хорошо. Постоянная перезагрузка страниц при просмотре элементов в списках, особенно, когда список был разбит по страницам, а возврат с Н-ной страницы после просмотра деталей записи приводил не назад на Н-ную страницу, а на первую – это неправильно.

В 2010 все хорошо. На первый взгляд.

Разработчики даже оставили возможность включать и отключать диалоговые окна в дополнительных параметрах списков и библиотек:

Даже если диалоговые окна включены, всегда можно в списке открыть ссылку в новом окне (CTRL+Click), тогда она откроется без диалога. Это достигается за счет использования в HTML как ссылки на страницу, так и JavaScript события onclick.

Вот как страница выглядит без диалога:

Адрес страницы был такой:

http://portal/Lists/Tasks/DispForm.aspx?ID=22&ContentTypeId=0x01080033DF2A7E09B15841AB447F1CE0E6D2DC

А теперь трюк – добавим в конец адреса строчку - &isDlg=1

Чувствуете разницу? Исчезло меню быстрого запуска, Действия сайта, закладка Обзор.

Но не тут-то было. Если посмотреть исходный код веб страницы в браузере, становится понятно, что вся разметка на месте, но она скрыта при помощи стилей CSS.

При этом все скрытые элементы выглядят примерно так:

<div id="s4-titlerow" class="s4-pr s4-notdlg s4-titlerowhidetitle">

 

В классах указан стиль s4-notdlg.

Через средства разработчика MSIE (F12) можно посмотреть, откуда появился стиль:

А пришел он из файла dlgframe.css

Встает вопрос, что за стиль .ms-dialog ? Оказывается, он прописан в тэге <html>.

Что получается? Получается, что что-то проверяет наличие в строке запроса параметра isDlg и добавляет необходимые стили на страницу. Сама по себе мастер страница этого не делает, поскольку ни от какого класса SharePoint не унаследована.

Я открыл .NET Reflector и стал искать, кто за что отвечает. Выяснилось, что за все отвечает элемент CssLink:

<SharePoint:CssLink runat="server" Version="4"/>

А именно:

private const string DialogV4CssFile = "dlgframe.css";

private void SetupDialogCSS() {}

 

А за выяснение открыта ли страница в диалоговом окне отвечает SPContext:

public bool IsPopUI

{

get

{

return (this.m_context.Request.QueryString["IsDlg"] != null);

}

}

 

Выводы

При дизайне страниц не удаляйте элемент CssLink или делайте это с умом.

Если Вы не хотите появления нежелательных элементов из мастер страницы в диалоговых окнах, оборачивайте их стилем s4-notdlg

Ну и наконец: Не используйте эти стили! Кому они нужны? Это кто-то в команде SharePoint явно поленился написать качественный код. Зачем генерировать ненужную разметку, которая прячется CSS стилями? Ведь это сказывается на производительности и сетевом трафике. Лучше сделать свой элемент управления по подобию UIVersionedContent, в который Вы упакуете все ненужные в диалогах элементы. А в коде этого элемента напишете условие с использованием SPContext.Curent.IsPopUI

Удачи в дизайне!

 

Курс Дизайн порталов SharePoint 2010 - http://www.sharepoint2010.ru/page/iw1005.aspx