(ASP.NET) ASP.NET (2005 год)

Структура сайта/проекта

Стандартная структура каталогов, создаваемая по FILE->NEW->WEB SITE, имеет очень много проблем. В первую очередь, она заточена исключительно на использование девелоперского сервера студии и не позволяет разбить сайт на несколько проектов. Этого совсем не нужно для крошечных проектов из нескольких страничек, но для реальных сайтов разбить сайт на несколько проектов просто необходимо - и этого, конечно, на встроенном WEB-сервере не достичь, для этого нужно работать только с IIS.


Именно для этого разработчики сделали несколько плагинов к VS2005, позволяющих создать ДОЧЕРНИЙ ПРОЕКТ внутри общего WEB-сайта (фактически это схема проекта из VS2003). Для этого надо сначала сгрузить отсюда HOTFIX KB915364, а потом проинсталлировать отсюда специальный плагин Web Application Project. После этого в студии все меняется, и свойства Web-проекта нового типа вместо таких становятся такими.

В принципе разбить сайт на отдельные проекты несложно, надо только правильно разобраться с подкаталогами, не забыть удалить web.config из Sub-проектов, создать директорию IIS только для главного сборочного проекта и создать единую директорию BIN для общего проекта и Sub-проектов. Это позволит создать ЕДИНУЮ КОРНЕВУЮ ТОЧКУ приложения для всех проектов сайта, от которой будут отсчитываться пути, контексты безопасности и пр. Существует пошаговая инструкция по разбиению сайта на проекты.


Однако, при реальной работе передо мной не только встала проблема разбить ОДИН САЙТ НА НЕСКОЛЬКО ПРОЕКТОВ, но и противопололжная. Сделать единые контролы для нескольких сайтов.

Для чего это мне понадобилось? Виртуальная директория - это фактически web-конфиг, который часто необходим РАЗНЫЙ для одного и того же сайта. Поясню, например, в сайте есть например часть ADMIN, которая требует FORMS-аутентификацию, USER - для анонимной аутентификации, MANAGER для Win-аутентификации и SQL-персонализации. Достичь этого В ОДНОЙ виртуальной директории не то, что в Девелоперском сервере, но даже в IIS нельзя. Из-за этого приходится делать НЕСКОЛЬКО САЙТОВ. Другая причина - иметь просто свои наработанные Web-контролы в виде откомпилированного кода. Третья - иметь одинаковый Header/Footer в нескокиз сайтах.

Единый код для нескольких сайтов в ASP2 делается двумя путями. Просто код - ложится в отдельный проект и в библиотеку (в GAC), откуда он становиться доступным для всех сайтов. А из Web-контролов, которые можно положить на ToolBox студии, приходится делать CUSTOM-контролы.

Последняя задача оказалась в ASP2 достаточно сложна, ибо, в отличие от Win-контролов, не имеет какой-нибудь поддержки в VS2005. Особенно неудобно оказалось преобразовывать вот такие контролы, которые ссылаются на внешнюю страничку. Фактически Custom-control в WebControlLibrary состоит из одного переопределенного метода: Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter), в котором выполняются все операции. Кроме того, необходимо вручную определять по состоянию "HttpContext.Current Is Nothing" Design/Run Time (например для доступа с CASHE). Для поддержки размещения на Toolbox'е студии предусмотрены ряд атрибутов.

Тему изготовления Custom-контролов и включения в них внешних страничек, на которые они ссылаются, подробнее я опишу позднее, а здесь я опишу ПРОСТЕЙШИЙ Custom-контрол.


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




Этот контрольчик реализуется следующим текстом:

00001: Imports System
00002: Imports System.Collections.Generic
00003: Imports System.ComponentModel
00004: Imports System.Text
00005: Imports System.Web
00006: Imports System.Web.UI
00007: Imports System.Web.UI.WebControls
00008: 
00009: <System.Drawing.ToolboxBitmap(GetType(Navigator), "i9.ico")> _
00010: Public Class Navigator
00011:     Inherits WebControl
00012: 
00013:     Dim NavigateURL As String()
00014: 
00015:     Public Sub NavigateList(ByVal ParamArray Str1() As String)
00016:         NavigateURL = Array.CreateInstance(GetType(System.String), UBound(Str1))
00017:         For i As Integer = 0 To UBound(Str1) - 1
00018:             NavigateURL(i) = Str1(i)
00019:         Next
00020:     End Sub
00021: 
00022:     Protected Overrides Sub RenderContents(ByVal output As HtmlTextWriter)
00023:         Dim OutputHtml As New StringBuilder
00024:         If NavigateURL IsNot Nothing Then
00025:             For i As Integer = 0 To NavigateURL.Length - 2 Step 2
00026:                 OutputHtml.Append("[<a href='" & NavigateURL(i + 1) & "'>" & HttpContext.Current.Server.HtmlEncode(NavigateURL(i)) & "</a>] ")
00027:             Next
00028:             output.Write(OutputHtml.ToString)
00029:         End If
00030:     End Sub
00031: 
00032: End Class

Для тех, кто еще не создавал Custom-контролы поясню - надо выбрать вот этот тип проекта, иконку следуют добавить к проекту и обозначить ее как Embedded resourse. После этого следуюет добавить откомпилированную библиотеку на панель инструментов.

Вот теперь, если потянуть мышкой и бросить на форму этот контрольчик, то в директорию BIN проекта скопируются файлики FriendSiteNavigator.dll и FriendSiteNavigator.xml, а на форме добавится определение контрола и собственно его вызов:

<%@ Register Assembly="FriendSiteNavigator" Namespace="FriendSiteNavigator" TagPrefix="cc1" %>
...
<asp:Literal ID="lHeader" runat="server"></asp:Literal></td>  
...

Теперь внимание, осталось самое главное - обеспечить УДОБСТВО вызова этого параметра. Для этого этот контрол удобно положить на MasterPage. Тогда автоматически получается место, где действительно сырой вызов этого контрола можно заменить на библиотечный.

Если все бросить прямо так, то пользоваться этим контролом будет просто невозможно - ведь совершенно НЕВОЗМОЖНО понять какой из параметров будет именем, а какой ссылкой:




А докрутив к СЫРОМУ вызову этого контрола указанный интерфейсик, мы получает ДЕЙСТВИТЕЛЬНО УДОБНЫЙ вызов этого библиотечного контрола, в котором уже никогда не спутаешь порядок - где наименование, а где ссылка:




Именно так убогий и неудобный внутренний интерфейс между контролом и MasterPage превратился в просто замечательный внешний интерфейс, действительно удобный со стороны странички!

В принципе, этот контрольчик в уже откомпилированном виде можно сгрузить отсюда.



Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17>  <18>  <19>  <20>  <21>  <22>  <23
Link to this page: //www.vb-net.com/asp2/1/index.htm
<SITEMAP>  <MVC>  <ASP>  <NET>  <DATA>  <KIOSK>  <FLEX>  <SQL>  <NOTES>  <LINUX>  <MONO>  <FREEWARE>  <DOCS>  <ENG>  <CHAT ME>  <ABOUT ME>  < THANKS ME>