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
_
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
runat="Server">
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.
Confira outros conteúdos:
Teste unitário com NUnit
Como migrar projetos do ASP.NET MVC...
Crie relatórios com o Stimulsoft...