Тэги

Silverlight (36) WPF (10) IIS (7) Visual Studio (7) SharePoint (6) .Net Framework (5) ODP.NET (5) ASP.NET (4) C# (4) common (4) Network Settings (3) JavaScript (2) MS Office (2) Resharper (2) WCF (2) WEB (2) XPath (2) XSLT (2) ADO.NET (1) APEX (1) CMD (1) CSS (1) EF (1) HTML (1) Hardware bugs (1) Java (1) MS SQL (1) Oracle (1) PDF (1) Version Control (1) XAML (1)

пятница, 19 июня 2009 г.

Как добавить файла кода ( codefile ) для страницы SharePoint, котораяего не поддерживает, а также – Обход невозможности добавленияобработчика серверного события в разметке страницы SharePoint, неподдерживающей файл кода.

Решаемая проблема: Страницы сайта SharePoint храняться в базе и не поддерживает раздельный файл кода. При добавлении в <%@ Page … CodeFile="Default.aspx.cs" %> атрибута CodeFile SharePoint ругнется с ошибкой Parser Error.
Надеюсь данная статья сэкономит ваше время. Ничего подобного в сети я пока не нашел.
Как добавить раздельный файл кода? Я применяю два подхода:
  1. Добавить на страницу ваш кастомный элемент управления, который подключается к нужным событиям страницы и элементам управления через <%@ Register %>.
  2. Создать вашу страницу, наследующую Microsoft.SharePoint.WebPartPages.WebPartPage и прописать ее в атрибуте inherits в <%@ Page … inherits="Company.MyItems.MySpPage" %>
На словах, решается это так:
  1. Добавляем в семейство сайтов нашу сборку с нужными классами.
    Обычно в C:\inetpub\wwwroot\wss\VirtualDirectories\80\bin.
  2. Прописываем в файле разметки элемент управления или полностью переопределяем класс страницы.
Инструменты:
  1. Visual Studio для правки кода.
  2. SharePoint Designer для правки страниц, хранящихся в базе данных SharePoint.
Опционально: Очень удобно в Visual Studio 2008 использовать VSeWSS 1.3, но, по опыту, первый раз вам придется потратить нервы, чтобы его настроить, так что если вам срочно, то совсем не стоит заморачиваться. Если не срочно, то читайте у меня здесь или погуглите хорошенько.
Нюансы: Я не сторонник класть сборку в GAC и кладу ее в папку bin семейства сайтов (обычно C:\inetpub\wwwroot\wss\VirtualDirectories\80\bin), что требует небольшого изменения web.config семейства сайтов.
В web.config ‘е сайта находим
<SharePoint>
<SafeControls>
и добавляем запись
<SafeControl Assembly="MyItems" Namespace="Company.MyItems" TypeName="*" Safe="True" />
Вот для этого удобен VSeWSS 1.3, хотя можно и ручками.
Особенности написания кода:
* SharePoint на даст вам переопределять обработчики событий, например OnInit, поэтому используйте прикрепление ваших обработчиков в конструкторе, например
public MySpPage()
{
    Init += new EventHandler(mySpPage_Init);
}
* Нахождение контролов страниццы по их ID часто не работает. Это обходиться при помощи самописного контрола-посредника, который предоставляет нужный вам контрол. Для этого целевой контрол может класться внутрь посредника (наследуйте в этом случае посредника от Panel), но поскольку SharePoint Designer не переваривает эту ситуацию, то я размещаю посредника сразу перед целевым контролом.
Не забудте в коде нахождения игнорировать LiteralControl, который создается парсером разметки HTML / ASP.NET.
У меня посредники часто сами содержат логику, добавляющую новые действия в целевой контрол. В этом случае я их называю “Экстендерами”.
Часто перед целевым контролом может стоять подряд несколько экстендеров и я учитываю в коде нахождения, что помимо литералов могут попасться другие посредники перед целевым контролом.
Примеры использования экстендеров: редирект после удачного сохранения в SqlDataSource, добавление пустого айтема в начало списка DropDownList и тд и тп.
Прикрепление серверного обработчика в разметке страницы, не поддерживающей раздельный файл кода :
SharePoint нам не даст задать серверный обработчик в разметке. Он нам выдаст ошибку
Parser Error
Parser Error Message: The event handler 'OnUpdating' is not allowed in this page.
Ну и напрасно. Давайте использовать описанные выше выше экстендеры для задания обработчиков нужных серверных событий.
Это даже лучше из-за предоставляемой ими инкапсуляции и замечательной гибкости.
Хотя мне кажется, что всетаки, какие-то серверные события я в разметке присоединял. Попробую если опять появиться какой-то проект по SharePoint.
Важные замечания по кодированию экстендера или простого контрола-посредника:
  • Найти корректно целевой контрол. Нюансы описаны чуть выше. Это игнорирование LiteralControl и других экстендеров.
  • Нужна правильная точка прикрепления логики экстендера в целевом контроле.
    Я предлагаю в конструкторе экстендера прекреплять обработчик к событию Init родительского контрола:
    this.Parent.Init += new EventHandler(Parent_Init);
    Это подайдет в 98% случаев.
    Среда гарантирует, что событие Init родителя, в отличии от события Load всегда сработает позже события Init потомка в дереве контролов.
    Можно использовать удобное событие Page.InitComplete, но тогда вы не сможете подцепиться к контролам, которые находяться внутри шаблона, шаблонного элемента управления, например внутри
    <asp:FormView … >
        <InsertItemTemplate>…
    А вот в обработчике Parent_Init мы уже вольны с целевым контролом делать все что захотим. Прекреплять события, изменять свойства и тд.
На этом все :
Экономлю время, поэтому…
Теперь давайте я буду добавлять в статью информацию по необходимости, тк подозреваю, что заинтересованных лиц в моей стране не много :).
Примеры кода подготовлю, если будут непонятки.
Самому мне нужно некоторое время, чтобы забыть статью и прочитать ее, как бы со стороны, чтобы увидеть что в ней изложено не слишком доступно.

среда, 17 июня 2009 г.

MethodAccessException из-за модификатора public в SharePoint и VSeWSS

Если вас привлекли следующие строки
MethodAccessException SetProperty System.Web.Util.FastPropertyAccessor.SetProperty
[HttpException (0x80004005): 'qqq' could not be set on property 'U'.]
System.Web.UI.ControlBuilder.SetSimpleProperty(SimplePropertyEntry entry, Object obj)
, то, возможно, вы используете свой класс наследник другого контрола, у которого забыли выставить атрибут доступа public.
У меня эта ошибка появляется, когда я в разметке добавляю свой контрол и задаю значение созданному программно свойству. Т.е. свойство имеет модификатор public, а класс не имеет модификатора, что означает private по умолчанию.
Обычно, в таком случае, ожидаешь увидеть другой текст ошибки, но SharePoint показал приведенный выше текст.

среда, 10 июня 2009 г.

SharePoint Designer 2007 – сырой и еще сырее!

При разработке под SharePoint нельзя обойтись без Microsoft Office SharePoint Designer, но имейте ввиду следующие сюрпризы, которые он вам обязательно приподнесет:
  1. Вызов меню Вставка –> Элементы управления SharePoint –> Форма настраиваемого списка не приводит к вставке. Замечено, когда работаешь из другой локальной подсети и приходиться коннектиться к сайту через IP, а не по имени компьютера. Лечиться при локальном запуске на компьютере на котором установлен открываемыей сайт SharePoint.
  2. Designer позволяет создать и настроить источник данных SqlDataSource подключенный к вашей базе, но обновление схемы ( Refresh Schema ) не работает. Лечиться при локальном запуске на компьютере на котором установлен открываемыей сайт.
  3. SharePoint Designer не понимает стандартное расширение разметки в источнике данных вида ConnectionString="<%$ ConnectionStrings:ConnectionStringName1%>" и засталяет разработчика тупо копировать строку подключения, вместо того, чтобы дать прописать ее один раз в web.confog узда сайтов. Причем страница в бразере нормально открывается и отображает данные. Не лечится.
  4. Подробности источника данных не показывают данные для источника данных “Подключение к базам данных”. А потом вдруг раз и показывает :)
  5. После изменнеия схемы базы данных, например при переименовании колонки таблицы, GridView, FormView или DetailsView в окне дизайнера отображают сообщением об ошибке, хотя все наименования колонок в запросе вы привели в соответствие с новыми изменениями. Переименуйте используемый ими SqlDataSource, а потом верните имя обратно.
  6. При добавлении на страницу контрола вашего класса, например <my:MyControl> дизайнер глючит с отображением, особенно, если вы поместили ваш контрол в шаблон шаблонного элемента управления, например в шаблон FormView.
    Это лечиться временем :), а точнее я не разобрался как. То помогает изменение разметки, например обернут ваш контрол в PlaceHolder, сохранить, а потом удалить PlaceHolder, то помогает закрытие Дизайнера –> перезагрузка IIS –> открытие дизайнера.
    В общем я плакаль :).
Теперь вы готовы к подбным сюрпризам.

суббота, 6 июня 2009 г.

Спасение в Silverlight и подарок в виде .NET RIA Services в Silverlight 3.


Июнь 2009.

Сегодня ни что не может быть оправданием для разработки корпоративных приложений не на Silverlight.

По мере распространения технологий богатого веба канет в лету и старый стек WEB-технологий. Я вам этого желаю.


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


Сильверлайт это т.н. богатая интернет технология – Rich Internet Applications (RIA) и первопроходец здесь Flash, хотя Microsoft подняла планку на новый высокий уровень.


Перечислю вам основные преимущества Silverlight:


  1. Гораздо больше возможностей в сравнении с любыми существующим фреймворком.

  2. У этого ребенка одна нянька, что многократно снижает стоимость массовых приложений, тк не нужно переделывать, чтоб работало на всех этих браузерах.

  3. Можно разрабатывать как WEB, так клиентские приложения. Это давно есть у Adobe (Macromedia).

  4. Очень легко в освоении, что порадует как разработчиков, так и их руководителей.
    Профессионально освоить стек старых WEB-технологий просто, но долго. До последнего не понятно, разбирается ли человек в WEB или знает его частями, или по верхам.

  5. Просто не глючит. В сравнении с Silverlight любой JavaScript UI Framework это мертворожденный ребенок.

  6. Много готовых, действительно нужных элементов управления, а не всякий там Инфрагистик :).

  7. Владея Silverlight вы владеете WPF технологией и наоборот. За мелкими тонкостями и низкоуровневой реализацией это одно и тоже.

  8. Silverlight будет работать на ваших MAC и Linux машинах.


До недавнего времени, принцип разработки на Silverlight под WEB был похож на стандартное AJAX-приложение или как некоторые скажут WEB 2.0. Имелась клиентская логика, серверная сторона и некое общее решение для передачи данных с сервера на клиент и обратно.

Теперь Microsoft преподнесла нам подарок, который позволяет вести разработку для WEB, как будто мы разрабатываем клиентское приложение. Это позволяет сосредоточиться на бизнесе и юзабилити и не тратить усилия на создание промежуточных звеньев. Позволяет разработать и предложить заказчику дополнительный функционал.

Это решение называется .Net RIA Services и доклад Сергея Звердина является прекрасным руководством к действию, раскрывающим многие технические аспекты.

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

Сам доклад лежит по адресу http://www.techdays.ru/Lecture.aspx?LID=1287

Для просмотра требуется регистрация.

Презентации и исходных кодов пока к докладу нет.


Многие компании сейчас развивают свои RIA, поэтому я надеюсь на новое богатое творческое будущее WEB. Меня больше устраивает наличие нескольких популярных конкурирующих сред, чем набор общих стандартов и множество их интерпретаций.

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