Revista MSDN Magazine Edição 06 - Starter Kits - Crie Aplicativos em ASP.NET

Artigo Originalmente Publicado na MSDN Magazine Edição 06

Clique aqui para ler todos os artigos desta edição

 

Starter Kits – Crie Aplicativos em ASP.NET

por Paul Litwin

 

O ASP.NET e o Visual Studio® .NET certamente simplificaram o desenvolvimento de aplicativos Web. No entanto, criar um web site em ASP.NET ainda exige algum esforço de sua parte. Você ainda precisará projetar um aplicativo estável e desenvolvê-lo com um código sólido e reutilizável, totalmente testado. No meio desse processo, você poderá se perguntar, "Ninguém cuidou desse problema antes? Estarei apenas reinventando a roda?" Alguns cenários são comuns à maioria dos desenvolvedores em ASP.NET, como arquitetar um site de comunidade (community), rastrear o tempo de um projeto ou criar um portal para uma empresa. Seria ótimo poder criar sobre uma estrutura bem projetada, em vez de precisar projetar o aplicativo do zero, mesmo que isso significasse customizar e estender a solução. Esse é exatamente o objetivo dos ASP.NET Starter Kits.

Os ASP.NET Starter Kits consistem em um conjunto de cinco aplicativos de exemplo da Microsoft que você pode baixar em http://www.asp.net/starterkits. Eles contêm um aplicativo de frente de loja de comércio eletrônico, um web site de comunidade, um site de portal, relatórios de exemplo e um aplicativo de gerenciamento de tempo de projetos. A finalidade desses kits é fornecer vários projetos úteis e alguns exemplos de códigos ASP.NET, com os quais você poderá aprender e se basear. Todos os cinco kits vêm com código fonte completo, utilizam SQL Server™ ou Microsoft® Data Engine (MSDE) como banco de dados e estão disponíveis em Visual Basic®, C# e J#. Além disso, eles também são encontrados nas versões do Visual Studio .NET (com páginas .aspx e codebehind separadas) e SDK (sem páginas codebehind). Desse modo, você pode usar seu ambiente de desenvolvimento favorito para trabalhar com os starter kits, seja ele Visual Studio .NET, ASP.NET Web Matrix Project ou qualquer outro editor. Neste artigo, apresentarei os cinco ASP.NET Starter Kits. Em seguida, analisarei o Community Starter Kit e mostrarei como você pode estendê-lo em função de suas necessidades especiais.

 

Os Starter Kits de Commerce e Portal

O Commerce Starter Kit cria um aplicativo de frente de loja de comércio eletrônico para uma empresa de espionagem fictícia, IBuySpy. O aplicativo utiliza uma arquitetura em três camadas, armazenamento em cache (caching), forms authentication e um carrinho de compras. O Commerce Starter Kit também inclui um componente Web Service B2B. Trata-se de um excelente aplicativo para estudo e aprendizado, especialmente para aqueles que precisarão criar efetivamente um aplicativo de comércio eletrônico.

O Portal Starter Kit cria o aplicativo de portal para o IBuySpy, a mesma empresa fictícia incluída no Commerce Starter Kit. O Portal Starter Kit oferece 10 módulos de portal: announcements, contacts, discussion, events, html/text, image, links, quicklinks, xml/xsl e um módulo personalizado.

 

O Time Tracker Starter Kit

O Time Tracker Starter Kit (veja a Figura 1) é essencialmente um aplicativo intranet de controle de tempo e faturamento, sem um componente para faturamento, sendo bastante objetivo e contém três guias: Log, Reports e Administration. Você usa a guia Administration para configurar projetos, a guia Log para registrar as horas e a guia Reports para gerar relatórios por projeto ou indivíduo.

 

Figura 1 Guia Log no Time Tracker Starter Kit

 

Este kit mostra diversos recursos de arquitetura ASP.NET interessantes, como design em três camadas, Windows® and forms authentication, geração de gráficos dinâmica com GDI+ e um front-end para dispositivos móveis.

 

O Reports Starter Kit

O Reports Starter Kit difere de outros kits, já que ele não é um aplicativo propriamente dito. Em vez disso, ele consiste em uma série de oito relatórios que você pode ler, comparar com dados de exemplo e examinar o código fonte. Além disso, você pode copiar e colar o código fonte em seus próprios aplicativos. Esse kit funciona de forma semelhante ao ASP.NET QuickStarts fornecido no Microsoft .NET Framework SDK e no Visual Studio .NET. Os exemplos de relatórios abrangem relatórios tabulares simples, dois estilos de relatórios de detalhamento hierárquico, guias cruzadas (cross tabs) e vários gráficos GDI+.

 

O Community Starter Kit

O Community Starter Kit provavelmente será a estrela do show. Sem muito esforço ou conhecimento, você poderá usá-lo para formar rapidamente um site de comunidade para um grupo de usuários, clube, família ou qualquer comunidade. Você também poderia usá-lo para formar um site simples de informações e notícias. Em alguns aspectos, ele coincide com a funcionalidade fornecida pelo Portal Starter Kit, mas é mais voltado para organizações não comerciais e é mais fácil de configurar e gerenciar.

O Community Starter Kit suporta diferentes tipos de conteúdo, como artigos, galerias de fotos e listas de eventos. Além disso, suporta vários recursos opcionais comuns a muitos sites de comuidades, como anúncios, moderação, cotas de upload, classificações, comentários, pesquisas de opinião de usuários, notificações de alteração de conteúdo, transformações automáticas, tópicos, Web boxes, publicações periódicas, newsletters, skins e segurança.

Os anúncios são manipulados por um par de controles AdRotator, um em um banner de tamanho padrão (468×60 pixels) e o outro em 125×125 pixels. Se você ativar a moderação para uma seção, o conteúdo precisará ser aprovado por um moderador antes de ser exibido no site. Você pode definir cotas de upload para cada usuário a fim de limitar o número de imagens e arquivos que possam ser carregados no site. O Community Starter Kit também suporta uma cota de upload para a comunidade toda. Isso permite ao ISP alojar várias comunidades em um único local, impedindo assim que um único site se aproprie de todo o espaço em disco disponível.

Você tem a opção de ativar comentários e classificações de usuário para um dado tipo de conteúdo, como livros ou artigos. Os usuários podem classificar um item de conteúdo em uma escala de 1 a 5 ou, se preferirem, pode inserir um comentário no lugar da classificação (ou junto a ela).

O Community Starter Kit suporta a criação e geração de relatórios de pesquisas de opinião de usuários (enquetes). Desse modo, você pode perguntar aos usuários questões como "Qual a sua linguagem de desenvolvimento .NET favorita?" ou "Qual era o nome do baterista original do Led Zeppelin?" Você também pode notificar os usuários a respeito de novos conteúdos disponíveis em uma seção ou pode até especificar transformações para que uma linguagem obscena seja automaticamente retirada das submissões e comentários sem que seja necessária intervenção de sua parte.

O Community Starter Kit possui uma opção que lhe permite criar uma lista de tópicos, de modo a solicitar aos usuários que categorizem as contribuições à medida que elas forem adicionadas. Assim, seu site de notícias relacionadas ao .NET Framework poderá ter tópicos como ASP.NET, managed C++, Web Services etc.

O Community Starter Kit permite que você adicione chamadas de conteúdo às margens das páginas, ativando várias Web boxes. Por exemplo, você poderia usar uma Web box para exibir os artigos mais novos ou mais populares, links, downloads ou fotos na home page. Você também pode usar quotes na Web box exibir chamadas aleatórias em uma página.

O Community Starter Kit aceita replicação de conteúdo por meio de dois mecanismos: service subscriptions e Web Service boxes. Usando um service subscription, você pode agregar conteúdo de uma seção de outro site Community Starter Kit e exibi-lo em seu site. Por exemplo, você pode se inscrever em uma seção de discussão de outro site comunitário e exibi-la em seu site como se fosse sua própria seção de discussão. A exemplo das Web boxes, as Web Service boxes exibem fragmentos de informação nas margens da página; no entanto, as Web Service boxes podem obter seu conteúdo a partir de outros sites. Você pode se inscrever em outro site Community Starter Kit que tenha publicado seu conteúdo como um XML Web Service ou pode inscrever-se em serviços RSS. Você pode publicar qualquer seção de seu site como um serviço comunitário, empregando XML Web Services e o protocolo SOAP (mas não o protocolo RSS). As seções publicadas podem ser consumidas como um service subscription ou um Web Service box.

Você pode enviar newsletters para os membros da comunidade. O componente newsletter suporta modelos e a incorporação de tags especiais que você pode usar para incluir campos como Username, FullName e Password, bem como campos específicos aos conteúdos (como NewArticles, NewBooks e NewDownloads).

O mecanismo do Community Starter Kit suporta o conceito skins ou themes (temas) e permite que você altere radicalmente a aparência do site, escolhendo um tema diferente na página do administrador.

Este kit suporta um abrangente sistema de segurança que classifica os membros de acordo com suas funções: anonymous (anônimo), authenticated (autenticado), moderator (moderador) e administrator (administrador) ou de acordo com suas próprias funções personalizadas. Você também pode proteger qualquer seção do site de modo que apenas determinados tipos de usuários possam ver, adicionar, editar ou excluir conteúdo.

 

Figura 2 Exemplo de Web Site de Comunidade

 

A Figura 2 mostra diversos recursos utilizados pelo Community Starter Kit. Essa comunidade, um grupo fictício de usuários denominado Ballard .NET, usa o tema (theme) Professional. Repare na enquete exibida na parte superior da página e no community service feed box, denominado ".NET Tips & Tricks", na parte inferior direita da página.

Criando uma Comunidade

Depois de baixar e instalar o Community Starter Kit, a primeira coisa que você desejará fazer será remover os dados do site de exemplo. Para fazer isso, clique no link Login no canto inferior da barra de navegação e registre-se como usuário Admin, com uma senha Admin. (Troque essa senha assim que possível, uma vez que isso é um risco de segurança.) Uma vez logado, um novo link (Admin) aparecerá na barra de navegação. Clique nesse link para acessar a área de administração do site e role a página até localizar o link Delete Content.

Após excluir o conteúdo e retornar à home page da comunidade, você notará que ainda haverá algum conteúdo de exemplo. Para substituir o conteúdo da home page pelo seu próprio conteúdo, você precisará retornar à página do administrador, clicar em Edit Sections, clicar na seção Home e fornecer um título, uma descrição e um logo para o site. Você também pode usar a opção Edit Sections para alterar o layout básico da home page, escolher um tema ou habilitar alguns recursos opcionais (como a exibição de Web boxes ou Web Service) para a home page.

Após definir o layout da home page, você pode adicionar as seções ao site. O site pode ter um número ilimitado de seções. Os tipos de seção (ou módulos) que podem ser criados estão listados na Tabela 1.

Para adicionar uma seção, clique no link Edit Sections na página do administrador. É possível criar várias seções do mesmo tipo. Por exemplo, a comunidade mostrada na Figura 2 contém duas seções Articles, News e Articles (artigos). Você pode usar uma seção-pai (superior) para ajudar a organizar um grupo de seções similares. Por exemplo, se quisesse separar seus downloads por categorias gerais, você poderia criar uma seção-pai que contivesse várias seções de download, como User Contributions (Contribuições de Usuários), Controls (Controles) e Speaker Presentations (Apresentações de Palestrantes).

Na página Edit Sections, é possível habilitar vários recursos opcionais para uma seção específica, como notificações de e-mail ou moderação. Além disso, também é possível publicar o conteúdo da seção como um Web Service comunitário.

 

Tabela 1 Módulos do Community Starter Kit

Tipo de seção

Descrição

Articles

Contém artigos, notícias, listas de FAQs (perguntas mais freqüentes) e dicas.

Books

Informações sobre livros. Suporta inclusão de imagens e vários campos, como autor, ISBN, editora e preço.

Custom Modules

Conteúdo de controle de usuário.

Discuss

Fórum de discussão. Suporta postagens bloqueadas e públicas e anúncios.

Downloads

Arquivos disponíveis para download.

Events

Informações sobre encontros da comunidade e outros eventos. Você pode especificar uma data de visibilidade para que um evento fique oculto até que deseje exibi-lo.

HTML Page

Conteúdo de uma página HTML única. Por exemplo, você pode usar essa página para uma página do tipo "Entre em contato".

Links

Hyperlinks.

Seção-pai (parent-section)

Container de outras seções. A página default é uma seção-pai, mas você pode adicionar outras seções-pai.

Photo Gallery

Galeria de imagens. Suporta geração automática de miniaturas  (thumbnails) de imagens.

 

Arquitetura do Community Starter Kit

Embora muitos sites sejam orientados a dados e gerados dinamicamente, a maioria deles ainda utiliza arquitetura estática. Apesar de isso não ser necessariamente uma coisa ruim, quanto mais conteúdo for gerado dinamicamente em um site, mais customizável este será. O Community Starter Kit é totalmente orientado a dados. Sem contar as páginas usadas na administração do site, o Community Starter Kit contém exatamente uma página .aspx, que é desprovida de conteúdo. Todo o conteúdo é armazenado em um banco de dados SQL Server ou MSDE. Uma única instalação desde Kit suporta várias comunidades, que podem ser configuradas por meio de uma conta ISPAdmin especial.

Quando o Web Server recebe uma solicitação para uma página do Community Starter Kit, o módulo HTTPModule denominado CommunitiesModule trata a solicitação e determina a comunidade, seção, página e usuário associado a ela; em seguida, ele monta os objetos CommunityInfo, SectionInfo, PageInfo e UserInfo, respectivamente. Esses objetos são membros da coleção Items do objeto Context. Como o objeto Context é utilizado por todos os módulos e tratadores que participam da solicitação, esses dados estarão disponíveis para a página que trata a solicitação. Em seguida, o CommunitiesModule redireciona a solicitação para a página communityDefault.aspx, que por sua vez é responsável por criar a resposta dinamicamente usando os objetos anteriormente mencionados, uma série de controles de usuários, classes de suporte e folhas de estilo.

De início, talvez este Kit não contenha todos os recursos que você deseja, mas o kit foi desenvolvido visando à capacidade de extensão. Se você não gostar da maneira como ele faz alguma coisa, poderá facilmente alterá-lo. Afinal de contas, ele é fornecido com o código fonte completo em Visual Basic .NET, C# e J#. Os elementos de temas e módulos desse kit são particularmente apropriados à customização.

Trabalhando com Temas

O design do Community Starter Kit é baseado no aplicativo ASP.NET Forums e, assim como este, utiliza temas (também chamados de skins) para separar a interface de usuário do código. Um tema é um pouco mais que uma folha de estilo (stylesheet). Na verdade, sem os temas não haveria conteúdo, porque eles contêm todos os controles que são exibidos no site. O tema é composto dos elementos listados na Tabela 2.

Para criar um novo tema, você precisa adicionar uma pasta abaixo da pasta Communities\Common\Themes. O nome do tema deriva do nome da pasta. Abaixo dessa pasta, crie as pastas mostradas na Tabela 2. Felizmente, não é necessário preencher cada pasta para um tema porque todos os temas herdam do tema base, Default. Desse modo, se você não fornecer um skin que seja necessário a um tema, o Community Starter Kit usará um skin do tema Default.

Embora o tema Default contenha mais de 75 arquivos, você pode criar um tema básico fornecendo apenas alguns arquivos. Eu criei um tema básico, denominado Small, que é uma cópia similar do tema Default. As diferenças básicas em relação ao tema Default são as fontes menores, uma alteração de cor de azul para vermelho e um layout diferente nas áreas da página padrão. Meu novo tema consiste em seis arquivos, listados aqui:

ØCommunities\Common\Themes\Small\Images\redshiny3dsquarebullet_7x7.jpg

ØCommunities\Common\Themes\Small\Skins\ControlSkins\Sections_SectionMenu.ascx

ØCommunities\Common\Themes\Small\Skins\PageSkins\Default.ascx

ØCommunities\Common\Themes\Small\Styles\an_red_arrow.gif

ØCommunities\Common\Themes\Small\Styles\Default.css

ØCommunities\Common\Themes\Small\Styles\redyellowstar.gif

 

Tabela 2 Elementos de um tema (Theme)

Elemento

Localização dos arquivos

Descrição

PageSkins

Themes\theme\Skins\PageSkins

Define o layout da home page. Altere esse skin para modificar o layout básico da home page, incluindo o número de colunas e o posicionamento dos controles de usuário.

ContentSkins

Themes\theme\Skins\ContentSkins

Layout de páginas específicas, como a página de artigos, a página de seção de artigos, a página de inclusão de artigos, a página de download ou a página de seção de download.

ControlSkins

Themes\theme\Skins\ControlSkins

Layout dos controles usados nas páginas, como o Web Service box ou o controle de exibição de comentários.

TemplateSkins

Themes\theme\Skins\TemplateSkins

Layout dos modelos usados pelos controles Repeater e DataList, como o ItemTemplate do controle DataList da galeria de fotos.

Stylesheet

Themes\theme\Styles

Todos os estilos genéricos usados nas páginas, como SectionMenu, bem como estilos específicos a módulo, tais como Article_IntroCell. A maioria dos temas (mas não todos) possui apenas uma folha de estilo, chamada default.css. Além das folhas de estilo, a pasta Styles contém várias imagens usadas pelas folhas de estilo.

Images

Themes\theme\Images

Imagens usadas pelos controles de usuário.

 

É claro, quanto mais elementos você fornecer, mais completo será o seu tema. Por exemplo, se descer até uma das seções usando o tema Small, você ainda verá controles com um plano de fundo azul. No entanto, se eu não tivesse alterado o esquema de cor do tema, ninguém teria pensado nisso. A maneira mais fácil de criar um novo tema é modelar o tema a partir de um tema existente e, em seguida, modificar os skins e estilos.

 

Criando um Novo Módulo

Apesar de ser um pouco mais trabalhoso que criar um tema, você também pode criar um modulo para sua comunidade. Por exemplo, criei um módulo chamado Jobs, que publica oportunidades de trabalho.

Para criar um novo módulo, primeiro adicione uma nova tabela ao banco de dados CommunityStarterKit e nomeie-a Community_module (onde module é o nome do novo módulo), que será usada para controlar os itens do novo módulo. A chave primária dessa tabela deve ser nomeada module_ContentPageID, juntamente com os nomes dos campos adicionais que você deseja reunir para o módulo.

Você precisará de stored procedures que possam ser usadas para adicionar um novo item de módulo, editar um item existente, recuperar uma lista de itens e recuperar todos os campos de um item individual. As stored procedures do módulo Jobs foram nomeadas Community_JobsAddJob, Community_JobsEditJob, Community_JobsGetJobs e Community_JobsGetJob. Copiei as stored procedures do módulo Articles e usei-as como modelo para as stored procedures do módulo Jobs, incluindo os campos adicionais necessários para controlar as postagens de trabalhos. Community_JobsGetJobs é usado para recuperar a lista de trabalhos da página Jobs_Section. Esse módulo chama a função Community_GetPagedSortedContent para paginar a saída (veja a Listagem 1).

 

Listagem 1 Community_JobsGetJobs Stored Procedure

CREATE PROCEDURE Community_JobsGetJobs

(

  @communityID int,

  @username NVarchar(50),

  @sectionID int,

  @pageSize int,

  @pageIndex int,

  @sortOrder NVarchar(50)

)

AS

 

DECLARE @currentDate DATETIME

SET @currentDate = GetUtcDate()

 

— Get the Articles

SELECT

Job_Company,

Job_TempStatus,

Job_TempMonths,

Job_StartDate,

Job_Location,

Job_Education,

Job_Experience,

Job_Salary,

Job_ContactName,

Job_ContactPhone,

Job_ContactEmail,

Job_ContactWeb,

Content.*

FROM

dbo.Community_GetPagedSortedContent

(

@communityID,

@username,

@sectionID,

@currentDate,

@sortOrder,

@pageSize,

@pageIndex,

default

) Content

JOIN Community_Jobs

ON Job_ContentPageID = ContentPage_ID

ORDER BY IndexID

 

Crie uma nova pasta abaixo de Engine\Modules que conterá o código do módulo. Nessa pasta, é necessário haver três subpastas, denominadas Components, Content e Controls. Para o módulo Jobs, criei as pastas Engine\Modules\Jobs\Components, Engine\Modules\Jobs\Content e Engine\Modules\Jobs\Controls. A pasta Components deverá conter duas class libraries, a primeira com uma classe que deriva da classe ContentInfo, e a segunda com uma classe utility que é responsável por chamar as stored procedures de cada módulo.

Usando a versão do Visual Basic .NET do Community Starter Kit, criei uma class library chamada JobInfo.vb, que contém uma única classe (JobInfo). Para isso, usei como modelo a class library ArticleInfo.vb. O construtor JobInfo recebe um único parâmetro, um DataReader, e o utiliza para capturar todos os campos da tabela Jobs. Em seguida, ele os coloca em variáveis privadas, que são então expostas como uma série de propriedades da classe JobInfo (veja o código na Listagem 2).

 

Listagem 2 Trecho de código da Classe JobInfo

Imports System

Imports System.Data.SqlClient

 

Public Class JobInfo

  Inherits ContentInfo

  Private company As String

  Private tempStatus As Boolean

  Private tempMonths As String = String.Empty

  Private startDate As String = String.Empty

  Private location As String = String.Empty

  Private education As String = String.Empty

  Private experience As String = String.Empty

  Private salary As String = String.Empty

  Private contactName As String = String.Empty

  Private contactPhone As String = String.Empty

  Private contactEmail As String = String.Empty

  Private contactWeb As String = String.Empty

 

  Public Sub New(ByVal dr As SqlDataReader)

MyBase.New(dr)

 

' Popula campos obrigatórios

   _company = CStr(dr("Job_Company"))

   _tempStatus = CStr(dr("Job_TempStatus"))

' Popula campos opcionais

  If Not (dr("Job_TempMonths") Is DBNull.Value) Then

_tempMonths = CStr(dr("Job_TempMonths"))

  End If

  If Not (dr("Job_StartDate") Is DBNull.Value) Then

_startDate = CStr(dr("Job_StartDate"))

  End If

  If Not (dr("Job_Location") Is DBNull.Value) Then

_location = CStr(dr("Job_Location"))

  End If

  If Not (dr("Job_Education") Is DBNull.Value) Then

_education = CStr(dr("Job_Education"))

  End If

  If Not (dr("Job_Experience") Is DBNull.Value) Then

_experience = CStr(dr("Job_Experience"))

  End If

  If Not (dr("Job_Salary") Is DBNull.Value) Then

_salary = CStr(dr("Job_Salary"))

  End If

  If Not (dr("Job_ContactName") Is DBNull.Value) Then

_contactName = CStr(dr("Job_ContactName"))

  End If

  If Not (dr("Job_ContactPhone") Is DBNull.Value) Then

_contactPhone = CStr(dr("Job_ContactPhone"))

  End If

  If Not (dr("Job_ContactEmail") Is DBNull.Value) Then

_contactEmail = CStr(dr("Job_ContactEmail"))

  End If

  If Not (dr("Job_ContactWeb") Is DBNull.Value) Then

_contactWeb = CStr(dr("Job_ContactWeb"))

  End If

 End Sub

 

  Public Property Company() As String

Get

Return _company

End Get

Set(ByVal Value As String)

_company = Value

End Set

  End Property

 

' ... continua com o restante das propriedades

 

A classe JobUtility fornece a interface entre o módulo Jobs e as stored procedures Jobs. Ela contém uma única classe, JobUtility, com quatro métodos: AddJob, EditJob, GetJobs e GetJobInfo. O método GetJobs é responsável por chamar a stored procedure Community_JobsGetJobs e retornar uma ArrayList de objetos JobInfo (veja a Listagem 3).

Listagem 3 Método GetJobs da Classe JobUtility

Public Shared Function GetJobs(_

  ByVal username As String, _

  ByVal sectionID As Integer, _

  ByVal pageSize As Integer, _

  ByVal pageIndex As Integer, _

  ByVal sortOrder As String) As ArrayList

  Dim conPortal As New _

  SqlConnection(CommunityGlobals.ConnectionString)

  Dim cmdGet As New SqlCommand(_

   "Community_JobsGetJobs", conPortal)

  cmdGet.CommandType = CommandType.StoredProcedure

  cmdGet.Parameters.Add("@communityID", _

CommunityGlobals.CommunityID)

  cmdGet.Parameters.Add("@username", username)

  cmdGet.Parameters.Add("@sectionID", sectionID)

  cmdGet.Parameters.Add("@pageSize", pageSize)

  cmdGet.Parameters.Add("@pageIndex", pageIndex)

  cmdGet.Parameters.Add("@sortOrder", sortOrder)

 

  Dim colJobs As New ArrayList()

  conPortal.Open()

  Dim dr As SqlDataReader = cmdGet.ExecuteReader()

  While dr.Read()

colJobs.Add(New JobInfo(dr))

  End While

  conPortal.Close()

  Return colJobs

End Function

 

A pasta Content deve conter uma class library para cada tipo básico de página que seja suportado pelo módulo. Essas classes se tornarão o código do code behind dos user controls  que você criará mais tarde. No mínimo, seu módulo precisa fornecer classes para cada um dos seguintes tipos de página: add item, edit item, display a list of items (para a seção da página) e display an individual item (para a página de acesso ao item). Essas classes precisam derivar de ContentAddPage, ContentEditPage, ContentListPage ou ContentItemPage, respectivamente. Como você já deve ter percebido, as classes Content tendem a ter uma correspondência “um para um” com as stored procedures que elas chamam.

Eu criei quatro class library: AddJob.vb, EditJob.vb, JobSection.vb e Job.vb, cada uma delas modelada de acordo com as class libraries Articles. As classes de conteúdo fazem a ligação entre a classe JobInfo e os skins de controle do usuário. A classe Job da class library Job.vb é responsável por exibir as informações completas de uma determinada lista de trabalho (veja a Listagem 4).

 

Listagem 4 Job.vb Class Library

Imports System

Imports System.Web.UI

Imports System.Web.UI.WebControls

Imports ASPNET.StarterKit.Communities

 

Namespace Jobs

  Public Class Job

Inherits ContentItemPage

 

Private skinFileName As String="Jobs_Job.ascx"

 

Private getContentItem As New _

GetContentItemDelegate(AddressOf _

JobUtility.GetJobInfo)

 

Public Sub New()

SkinFileName = _skinFileName

GetContentItem = _getContentItem

End Sub ‘New

  End Class ‘Job

End Namespace

 

A pasta Controls armazenará os server controls customizados para cada um dos trabalhos exibidos nas páginas Job e JobSection. Eu criei os seguintes server controls para a página Job: JobCompany, JobTempStatus, JobTempMonths, JobStartDate, JobLocation, JobEducation, JobExperience, JobSalary, JobContactName, JobContactPhone, JobContactEmail, JobContactWeb e JobEditContent. Para a página JobSection, criei o controle ItemJobLocation. O controle customizado JobCompany é mostrado na Listagem 5.

 

Listagem 5 JobCompany.vb Custom Server Control

Imports System

Imports System.Web

Imports System.Web.UI

Imports System.Web.UI.WebControls

Imports System.ComponentModel

Imports ASPNET.StarterKit.Communities.Jobs

 

<DESIGNER(GETTYPE(ASPNET.STARTERKIT.COMMUNITIES.COMMUNITYDESIGNER))>_

Public Class JobCompany

  Inherits WebControl

  Private _text As String

  Public Sub New()

CssClass = "jobOtherFields"

' Pega o obejto ContentInfo

If Not (Context Is Nothing) Then

Dim objJobCompany As JobInfo = _

CType(Context.Items("ContentInfo"), JobInfo)

If Not (objJobCompany Is Nothing) Then

text = objJobCompany.Company

End If

End If

  End Sub

 

  Public Property [Text]() As String

Get

Return _text

End Get

Set(ByVal Value As String)

_text = value

End Set

  End Property

 

  Protected Overrides Sub RenderContents( _

ByVal writer As HtmlTextWriter)

writer.Write(HttpUtility.HtmlEncode(_text))

  End Sub

End Class

 

Agora você precisa criar user control que representem os skins de conteúdo para cada uma das páginas de modulo básico que correspondam às classes SkinnedCommunityControl criadas na etapa anterior. No mínimo, você precisa fornecer um conjunto de user controls de skin de conteúdo para o tema Default. Você também pode fornecer user control de skin de conteúdo para temas adicionais.

Eu criei três controles de usuário dentro da pasta Themes\Default\Skins\ContentSkins: Jobs_AddJob.ascx, Jobs_JobSection.ascx e Jobs_Job.ascx. Não há nenhum user control para edição de trabalhos porque o controle Jobs_AddJob.ascx realiza as duas funções (adição e edição de trabalhos). A Listagem 6 mostra uma parte do código do user control Jobs_Job.ascx. Observe as referências aos server control customizados JobCompany e JobTempStatus da pasta Engine\Modules\Jobs\Controls.

 

Listagem 6 Jobs_Job.ascx User Control

<%@ Control %>

<%@ Register TagPrefix="Community"

Namespace="ASPNET.StarterKit.Communities"

Assembly="ASPNET.StarterKit.Communities" %>

 

 

 

 

 

 

 

  Neste ponto, adicionei estilos à folha de estilo padrão (Themes\theme\ Styles\default.css) para os novos controles de conteúdo. Vários desses estilos são mostrados na Listagem 7.

 

Listagem 7 Subconjunto de Novos Estilos do Módulo Jobs

.JobSection_SectionTitle {font-weight: bold; font-size: 17px;

font-variant: small-caps;}

.JobSection_SectionDescription {font-family: verdana, arial, helvetica,

sans-serif; font-size: 12px; font-weight: normal;}

 

.Job_Table {border: none;}

.Job_IntroCell {background-color:#EEEEEE;border:#CCCCFF solid 1px;}

.Job_BodyCell {background-color:#FFFFFF;}

.Job_Title {font-weight: bold; font-size: 17px; font-variant:

small-caps;}

.Job_BriefDescription {font-size: 12px; font-style: italic}

.Job_Label {font-size: 12px; font-weight: bold; font-style: italic;

background-color:#FFFFFF;}

.Job_OtherFields {font-size: 12px; color: #333333}

 

Por fim, adicionei entradas para o item e para as páginas de seção do item às tabelas Community_PageTypes e Community_NamedPages no banco de dados. Essa etapa é relativamente simples graças a stored procedure denominada Community_MaintenanceInitializeJobs que copiei da stored procedure Community_MaintenanceInitializeArticles existente. A execução dessa stored procedure criou as entradas de tabela necessárias.

 

Figura 3 Página JobSection

 

  A Figura 3 mostra a página JobSection do site da comunidade Ballard .NET. Se clicar no link Read More abaixo de uma postagem de trabalho, a página Job se parecerá com a da Figura 4.

 

Figura 4 Página Job

 

Conclusão

O ASP.NET Starter Kits fornece vários aplicativos de exemplo predefinidos que oferecem modelos de web sites funcionais e códigos de exemplo úteis em Visual Basic .NET, C# e J#. Os kits representam os aplicativos Web mais comuns, tais como sites de comunidade, de comércio, portais, geração de relatórios e gerenciamento de tempo de projeto. Este artigo analisou a instalação e o uso dos starters kits, bem como maneiras de customizar e estender o Community Starter Kit através de código (mesmo que você não possua o Visual Studio .NET). Se você estiver procurando uma maneira de começar seu site ASP.NET, esses kits podem ser o conjunto de conexões de que precisa. Também vale a pena mencionar que várias empresas de hospedagem de Web oferecem deployment automático de starter kits juntamente com o registro de conta. Para obter mais detalhes, consulte http://www.asp.net/hosters. Agradecimentos especiais a Stephen Walther por sua ajuda neste artigo.

Artigos relacionados

CssClass="Job_Title" Runat="Server">

Description:

CssClass="Job_BriefDescription" Runat="Server">

Company:

CssClass="Job_OtherFields" Runat="Server">

Temporary Job?

CssClass="Job_OtherFields" Runat="Server">