Pesquise palavras usando operadores adicionais. Criando e preparando um banco de dados

Todo desenvolvedor ASP.NET precisa estar familiarizado com as Diretivas de Página. Se você é iniciante e deseja aprender sobre as Diretivas de Página, pode ler este artigo.

Então a primeira pergunta é sobre as Diretivas de Página.

O que é uma Diretiva de Página?

Basicamente, as Diretivas de Página são comandos. Esses comandos são usados ​​pelo compilador quando a página é compilada.

Como usar as diretivas em uma página ASP.NET

Não é difícil adicionar uma diretiva a uma página ASP.NET. É simples adicionar diretivas a uma página ASP.NET. Você pode escrever diretivas no seguinte formato:

<%@%>

Veja o formato da diretiva, ele começa com "<%@" and ends with "%>". A melhor maneira é colocar a diretiva no topo da sua página. Mas você pode colocar uma diretiva em qualquer lugar da página. Mais uma coisa, você pode colocar mais de um atributo em uma única diretiva.

Aqui está a lista completa de diretivas:

  • @Página
  • @Mestre
  • @Ao controle
  • @Importar
  • @Implements
  • @Registro
  • @Conjunto
  • @MasterType
  • @Cache de saída
  • @PreviousPageType
  • @Referência

Vamos discutir algo sobre cada diretiva.

Quando você deseja especificar os atributos para uma página ASP.NET, você precisa usar a diretiva @Page. Como você sabe, uma página ASP.NET é uma parte muito importante do ASP.NET, então essa diretiva é comumente usada no ASP.NET.

<%@Page Language="C#" AutoEventWIreup="false" CodeFile="Default.aspx.cs" Inherits="_Default"%>

Agora você tem algumas informações sobre as Diretivas @Page. A Diretiva @Master é bastante semelhante à Diretiva @Page. A única diferença é que a diretiva @master é para páginas mestras. Você precisa observar que, ao usar a Diretiva @Master você define a propriedade da página de template, então qualquer página de conteúdo pode herdar todas as propriedades definidas na Página Mestra, mas existem algumas propriedades que só estão disponíveis em uma Página Mestra.

<%@Master Language="C#" AutoEventWIreup="false" CodeFile="MasterPage1.master.cs" Inherits="MasterPage"%>

@Ao controle

@Control cria controles de usuário ASP.NET. Ao usar a diretiva você define as propriedades a serem herdadas pelos controles do usuário e esses valores são atribuídos aos controles do usuário

<%@Control Language="C#" Explicit="True" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>

Como você sabe, você precisa definir namespaces em sua classe .cs antes de usar uma classe C# ou VB. Portanto, a diretiva @Import importa namespaces. Essa diretiva suporta apenas um único atributo "namespace" e esse atributo recebe um valor de string que especifica o namespace a ser importado. Uma coisa que você precisa observar é que a diretiva @Import não pode conter mais de um par atributo/valor. Mas você pode usar várias linhas.

<%@Import Namespace="System.Data"%>

@Implements

A Diretiva @Implements faz com que as páginas ASP.NET implementem interfaces de estrutura .Net. Esta diretiva suporta apenas uma interface de atributo único.

<%@Implements Interface="System.Web.UI.IValidator"%>

@Registro

Quando você cria um controle de usuário e arrasta esse controle de usuário para sua página, verá a diretiva @Register. Esta diretiva registra seu controle de usuário na página para que o controle possa ser acessado pela página.

<%@ Register TagPrefix="MayTag Namespace="MyName.MyNameSpace" Assembly="MyAssembly"%>

@Conjunto

A diretiva @Assembly anexa assemblies à página ou a um controle de usuário ASP.NET, portanto, todas as classes e interfaces de assembly estão disponíveis para a classe. Esta diretiva suporta os dois atributos Name e src. O atributo Name define o nome do assembly e o atributo src define a origem do assembly.

<%@Assembly Name="MyAssembly"%>
<%@Assembly src="MYAssembly.cs">

@MasterType

A diretiva @MasterType conecta um nome de classe à página ASP.NET para obter referências ou membros fortemente tipados contidos na página mestra especificada. Esta diretiva suporta os dois atributos Typename e virtualpath. Typename define o nome da classe derivada da qual obter os membros fortemente tipados ou de referência e virtualpath define o local da página da qual eles são recuperados.

<%@MasterType VirtualPath="/MasterPage1.master"%>

@cache de saída

Ele controla as políticas de cache de saída de uma página ASP.NET.

<%@ OutputCache Duration ="180" VaryByParam="None"%>
@Previouspagetype

Esta diretiva especifica a página da qual se origina qualquer postagem entre páginas.

@Referência

Esta diretiva declara que outra página ou mensagem de controle de usuário seja cumprida junto com a página ou controle ativo. Esta diretiva suporta o virtualpath de atributo único. Ele define o local da página ou controle de usuário do qual a página ativa será referenciada.

<%@Reference VirtualPayh="~/MyControl.ascx"%>

Palavras finais

Espero que você obtenha algum conhecimento a partir daqui. Por favor, comente sobre como você gosta deste artigo. Seus comentários são muito valiosos para mim, pois somente você me dirá onde estou errando e quais melhorias preciso fazer para escrever um artigo melhor. Por favor, comente e forneça seu feedback.

O que é um livro de visitas?

Claro, aqui estamos falando do livro de visitas mais típico. Em primeiro lugar, trata-se de um sistema que permite ao usuário inserir texto, selecionar uma avaliação de um determinado site e também especificar seus próprios dados (nome, e-mail, http, etc.). É também um sistema de apresentação de dados inseridos por diversos usuários, com possibilidade de navegar, enviar e-mails para os autores das mensagens. Variações também são possíveis com diferentes configurações e com o controle do vocabulário normativo.

O que nós precisamos

Obviamente, supõe-se que o leitor esteja familiarizado com os fundamentos da programação ASP e SQL (a familiaridade com as primeiras partes deste artigo será suficiente para isso). Além disso, precisamos do Microsoft SQL Server 7.0 ou 2000, algum editor de HTML ou texto (recomendo usar o Macromedia Dreamweaver UltraDev 4.0) e um pouco de paciência.

Criando e preparando um banco de dados

Para organizar o armazenamento dos dados inseridos pelos usuários, você precisa de uma tabela onde possa criar campos para armazenar o nome do usuário, seu endereço de e-mail, país de residência, endereço do site, endereço IP, valor de classificação do usuário do site em uma escala de cinco pontos, etc.:

Para integrar facilmente o sistema em sites existentes, é recomendável planejar outra tabela para armazenar cores e outras configurações. Isso permitirá que você altere as configurações especificadas no futuro sem alterar os parâmetros correspondentes nos textos de origem dos módulos do aplicativo do livro de visitas.

  • Execute o Configurador ODBC de Fontes de Dados - Iniciar->Configurações->Painel de Controle->Ferramentas Administrativas->Origens de Dados ODBC.
  • Vá para a guia DSN do sistema e crie uma nova fonte de dados clicando em Adicionar…
  • Na lista de drivers exibida, selecione o driver do banco de dados - Microsoft SQL Server e clique em Avançar.
  • Na linha Data Source Name, especifique o nome do seu banco de dados (no exemplo descrito, Gustbook é o nome pelo qual você se referirá a ele no futuro).
  • Na linha Servidor, especifique o servidor ao qual a conexão será feita e clique em Avançar.
  • Selecione o modo de autenticação Com SQL Server…, defina o nome de usuário e a senha para se conectar ao servidor SQL; defina o protocolo de comunicação do servidor (botão Configuração do cliente - TCP/IP) e clique em Avançar duas vezes e, em seguida, clique em Concluir.
  • Você verá estatísticas sobre as ações realizadas e poderá usar o botão Testar fonte de dados para verificar a fonte de dados.
  • Como resultado, você verá uma linha na lista de fontes de dados em seu sistema.

Agora que o banco de dados está pronto, você pode prosseguir diretamente para a criação de um livro de visitas.

Integração do sistema em um site pronto

É claro que o livro de visitas em si não faz sentido. Julgue por si mesmo: quem precisa de um site projetado exclusivamente para coletar as opiniões dos leitores. Afinal, para coletar opiniões sobre algo, você deve primeiro apresentar esse algo ao julgamento deles. Portanto, é necessário dar atenção especial às questões relacionadas à simplificação da incorporação do sistema em sites prontos.

Em particular, para facilitar a personalização do sistema para os recursos característicos de um determinado site, é recomendável (como mencionado acima) criar uma tabela especial para armazenar todas essas preferências para inserir determinados valores específicos do seu site afim disso. A vantagem óbvia dessa abordagem é que, para incorporar o sistema em um site já concluído, você não precisa fazer alterações no código-fonte dos módulos, basta alterar as configurações na tabela de banco de dados correspondente.

Imagine um exemplo da implementação de tal tabela: .

Como você pode ver, existem campos para armazenar informações sobre o nome e senha para acessar o modo de configuração do sistema, sobre as cores do fundo principal da mensagem do usuário, os quadros superior e inferior (campos Mid_Color, Top_Color, Bot_Color, respectivamente) , sobre a cor e tamanho do cabeçalho do formulário utilizado para inserir os dados do usuário (campos Form_Color e FormTitleSize, respectivamente), sobre a cor, tamanho e estilo da fonte do texto da própria mensagem, campos de informação, bem como as próprias páginas do guestbook (campos MessageFontColor, MessageFontSize, MessageFontFace, InfoFontColor, InfoFontSize, InfoFontFace, PageFontColor, PageFontSize e PageFontFace respectivamente), alterne os campos para habilitar o envio automático de notificações de novas mensagens por e-mail para o responsável (por exemplo, o gerente ou administrador do site), campos para armazenar o endereço de e-mail do responsável, o texto da mensagem com agradecimento pela mensagem deixada pelo usuário, com a lista não são permitidos x palavras e um interruptor para seu modo de filtragem (se este último estiver ativado, as palavras na lista de palavras inválidas serão automaticamente substituídas no texto da mensagem por asteriscos e, assim, o controle sobre a normatividade do vocabulário dos textos do site será exercido).

O desenvolvimento do sistema de integração do livro de visitas implica a organização de uma interface Web para a configuração de todos os parâmetros que consideramos (campos da tabela de administração).

A integração do sistema em um site já finalizado em sua forma pura pode criar algumas dificuldades tanto na percepção do texto fonte quanto no futuro, se, por exemplo, você precisar desabilitar temporariamente o livro de visitas em um determinado site. Portanto, tentaremos desenvolver um sistema de forma que sua integração em um site finalizado não seja difícil. Para isso, é necessário formar um módulo independente do sistema e incluí-lo no texto do site principal quando necessário. Assim, por exemplo, o texto da página do seu site pode ter esta aparência:

ASP em uma bandeja de prata (Parte - 15) – Livro de visitas

Como você pode ver, no primeiro caso, a diretiva para incluir uma página com um livro de visitas () é indicado no lugar certo e, no segundo caso, a página do site original é apresentada simplesmente na forma de três elementos incluídos sequencialmente: o início, a página do livro de visitas e o fim. Usar esta ou aquela forma de organizar a estrutura da página do seu site é uma questão de gosto e depende tanto da estrutura do site original quanto do grau de sua complexidade.

Página principal do livro de visitas (arquivo Guest.asp)

A aplicação apresentada terá apenas uma página, que servirá tanto para exibir as mensagens do usuário, quanto para navegar e inserir novas mensagens. Dependendo dos valores dos parâmetros-chave, uma ou outra ação será executada e a página estará em um estado ou outro. Antes de tudo, você precisará desenvolver aquela parte dela, que exibirá as mensagens do usuário e que conterá links para a parte que serve para adicionar novas mensagens.

Primeiro, vamos escrever algumas funções para trabalhar com strings:

  1. A função para substituir uma string vazia por um espaço e uma aspa simples por uma dupla:<% Function ChkString(string) If string = "" then string = " " ChkString = Replace(string, """, """") End Function %>
  2. A função de verificar o vocabulário do texto da mensagem quanto à normatividade. Se as palavras corresponderem a palavras da lista de palavras inválidas, substitua-as por asteriscos:<% Function ChkBadWords(String2) strBadWords = objRec2("BadWords") bwords = split(strBadWords, "|") For i = 0 to ubound(bwords) String2 = Replace(String2, bwords(i), string(len(bwords(i)),"*"), 1,-1,1) Next ChkBadWords = String2 end function %>
  3. A função de formatar o texto inserido pelo usuário. Se necessário (se houver um sinalizador correspondente no banco de dados), o texto será verificado (filtrado) quanto à normatividade:<% Function FormatStr(String) on Error resume next String = Server.HTMLEncode(String) String2 = Replace(String, CHR(13), "") String2 = Replace(String, CHR(10) & CHR(10), "

    ") String2 = Replace(String, CHR(10), "
    ") Se objRec2("BadOn") = True então String2 = ChkBadWords(String2) End if FormatStr = String2 End Function %>

  4. Função de verificação de campo:<% Function ValidateField(sFieldValue, sFieldType) Valid = True Select Case LCase(sFieldType) Case "name" If Len(sFieldValue) = 0 Then Valid = False Case "message" If Len(sFieldValue) = 0 Then Valid = False End Select ValidateField = Valid End Function %>
  5. O procedimento para adicionar novas mensagens (preste atenção em como o endereço IP do computador do qual a mensagem foi enviada é calculado):
<% Sub Update strSql = "insert into Messages (Name, Country, Email, URL,IP,Message,Rating) values ("" strSql = StrSql & ChkString(Request.Form("name")) & "", "" strSql = StrSql & ChkString(Request.Form("Country")) & "", "" strSql = StrSql & ChkString(Request.Form("email")) & "", "" strSql = StrSql & ChkString(Request.Form("URL")) & "", "" strSql = StrSql & Request.ServerVariables("REMOTE_ADDR") & "", "" strSql = StrSql & ChkString(Request.Form("Message")) & "", "" strSql = StrSql & ChkString(Request.Form("Rating")) & "")" objConn.Execute (StrSql) %>

Depois disso, os parâmetros de cores, tamanhos, fontes de design são extraídos e aplicados da tabela correspondente:

"cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("FormTitleSize")%>">Obrigado por sua entrada em nosso livro de visitas!

"cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> Clique aqui para ver sua entrada

Agora, envie um e-mail para o gerente ou administrador notificando você sobre uma nova postagem no livro de visitas, se necessário:

<% If Not(Request.Form("email"))="" AND objRec2("AutoEmail")=True then Name = Request.Form("name") Email = Request.Form("email") sFrom = objRec2("YourEmail") sTo=Email sSubject = "Спасибо, Ваша запись в нашей гостевой книге принята!" sMessage = "Дорогой(ая) " & Name & vbcrlf _ & vbcrlf _ & objRec2("ThankMessage") & vbcrlf _ & vbcrlf _ & vbcrlf Set objNewMail = CreateObject("CDONTS.NewMail") objNewMail.Send sFrom, sTo, sSubject, sMessage Set objNewMail = Nothing End If If objRec2("YouEmail")=True then Name = Request.Form("name") Home_Page = Request.Form("url") Email = Request.Form("email") Message = Request.Form("message") Country = Request.Form("Country") Address = Request.ServerVariables("REMOTE_ADDR") Rating = Request.Form("Rating") If Rating ="0" then Rating="No Rating" End If sFrom = objRec2("YourEmail") sTo= objRec2("YourEmail") sSubject = "Новое сообщение" sMessage = "Привет," & vbcrlf _ & "Новое сообщение поступило в гостевую книгу" & vbcrlf _ & vbcrlf _ & ":" & vbcrlf _ & vbcrlf _ & Message & vbcrlf _ & vbcrlf _ & "Детали сообщения:" & vbcrlf _ & "Ваше имя: " & Name & vbcrlf _ & "Email: " & Email & vbcrlf _ & "URL: " & Home_Page & vbcrlf _ & "Страна: " & Country & vbcrlf _ & "Рейтинг: " & Rating & vbcrlf _ & "Адрес: " & Address Set objNewMail = CreateObject("CDONTS.NewMail") objNewMail.Send sFrom, sTo, sSubject, sMessage Set objNewMail = Nothing End If End Sub %>

Formulário para inserir novos valores

Também é aconselhável envolver no procedimento a exibição de um formulário usado para adicionar novas mensagens (observe que o formulário é fechado sobre si mesmo, ou seja, o módulo que o contém serve como reação a ele):

<% Sub ShowForm(Sign) %>

>
"cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("FormTitleSize")%>"> Deixe uma entrada em nosso livro de visitas

">* Indica campos que devem ser lembrados

colspan=2> "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> Seu nome: *
"tamanho=30> <% If dictFields(LCase("name")) Then Response.Write "Você deve inserir um nome
" Outra resposta. Escreva "
" Terminar Se %>
colspan=2> "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> E-mail:
"tamanho=30>
colspan=2> "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> URL:
"cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> http:// "tamanho=30>
colspan=2> "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> O país:
"tamanho=30>
"cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> Como você avalia nosso site?
"cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%> ">Os teus comentários: *
"color="vermelho" tamanho="-2"><% If dictFields(LCase("message")) Then Response.Write "Вы не ввели сообщение
" Outra resposta. Escreva "
" Terminar Se %>
<% End Sub %>

Isso é seguido pela função principal para exibir um número fixo de mensagens do usuário (o valor recuperado da tabela de configurações administrativas):

<% Sub Show NumPerPage=INT(objRec2("NumPerPage")) If Request.QueryString("page") = "" Then iPageCurrent = 1 Else iPageCurrent = CInt(Request.QueryString("page")) End If Set objRec = Server.CreateObject ("ADODB.Recordset") StrSql = "SELECT * FROM Messages ORDER BY ID DESC;" objRec.PageSize = NumPerPage objRec.CacheSize = NumPerPage objRec.Open StrSql,objConn,3,1,&H0001 iPages = objRec.PageCount TotalRows = objRec.RecordCount If iPageCurrent >iPages Então iPageCurrent = iPages Se iPageCurrent< 1 Then iPageCurrent = 1 If iPages = 0 Then Response.Write "Не найденно записей!" Else ObjRec.AbsolutePage = iPageCurrent %>

"cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> Total no livro <%=TotalRows%> entradas em <%=iPages%> Páginas)

<% iRecordsShown = 0 Do While iRecordsShown < NumPerPage And Not objRec.EOF Rating = ObjRec("Rating") If IsNull(Rating) or Rating="0" then Rating = "nr" Else Rating = ObjRec("Rating") End If If IsNull(ObjRec("URL")) then Link = "Не указан URL" Else Link = "http://" & ObjRec("URL") & "" End If Email = FormatStr(ObjRec("Email")) Name = FormatStr(ObjRec("Name")) %>
"> "cor="<%=objRec2("InfoFontColor")%>"tamanho="<%=objRec2("InfoFontSize")%>"><%=ObjRec("DateID") %> "> "cor="<%=objRec2("InfoFontColor")%>"tamanho="<%=objRec2("InfoFontSize")%>">Classificação do site: .gif" altura="14" largura="65">
"> "cor="<%=objRec2("MessageFontColor")%>"tamanho="<%=objRec2("MessageFontSize")%>"><%=FormatStr(ObjRec("Message"))%>
"> "cor="<%=objRec2("InfoFontColor")%>"tamanho="<%=objRec2("InfoFontSize")%>"> <% If IsEmpty(Email) or Email=" " then Response.Write Name Else Response.Write "" & Nome Termina Se %> "> "cor="<%=objRec2("InfoFontColor")%>"tamanho="<%=objRec2("InfoFontSize")%>"><%=FormatStr(ObjRec("Country")) %> IP:<%= ObjRec("IP") %> "> "cor="<%=objRec2("InfoFontColor")%>"tamanho="<%=objRec2("InfoFontSize")%>"> <%=Link%>

<% iRecordsShown = iRecordsShown + 1 objRec.MoveNext Loop if iPages >1 então %>

"cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> Páginas: <% For I = 1 To iPages If I = iPageCurrent Then Response.Write ""&EU&"" Outra resposta. Escreva " "&EU&"" Terminar na próxima resposta. Escrever "" Else Response.Write " " End If End If objRec.Close Set objRec = Nothing End Sub %>

Preste atenção em como o link para visualizar a próxima página com essa “porção” de mensagens é formado e implementado:

Resposta.Escrever" "&EU&" "

Como você pode ver, o número da página é passado para ele como o valor do parâmetro page e, posteriormente, se esse valor não for igual a 1, a exibição das mensagens não inicia na primeira mensagem, mas na que será seja o primeiro na conta na página com o número correspondente especificado no parâmetro:

<% NumPerPage=INT(objRec2("NumPerPage")) If Request.QueryString("page") = "" Then iPageCurrent = 1 Else iPageCurrent = CInt(Request.QueryString("page")) End If %>Segue o texto fonte do próprio módulo, no qual a conexão com o banco de dados é feita e os registros são recuperados (no exemplo descrito, este será o único registro) da tabela de configurações administrativas do Admin:<% Set objConn = Server.CreateObject ("ADODB.Connection") objConn.Open StrConn Set objRec2 = Server.CreateObject ("ADODB.Recordset") ConfigSql = "SELECT * FROM Admin;" objRec2.Open ConfigSql,objConn,0,1,&H0001 %>

Em seguida, você pode estilizar o título e as tags principais da página HTML:

ASP em uma bandeja de prata parte 15 - livro de visitas DIY

"cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>">

Ver livro de visitas | Deixe uma entrada no livro de visitas

E, finalmente, o loop principal para processar sua página principal e única asp do módulo ficará assim:

<% select case Request.QueryString("mode") case "post" Dim Field Dim dictFields Set dictFields = Server.CreateObject("Scripting.Dictionary") For Each Field in Request.Form If ValidateField(Request.Form(Field), Field) = False Then dictFields.Add LCase(Field), True End If Next If Request.Form.Count <>0 E dictFields.Count = 0 Então chame Update Else If Request.Form.Count<>0 Then End If ShowForm("Sign") End If case "show" Call Show case Else Call Show End Select %>

Apenas dois casos são considerados aqui, correspondentes a duas funções da nossa aplicação Web: adicionar uma nova entrada ao livro de visitas (o valor do parâmetro mode = “post”) e visualizar as mensagens do livro de visitas (o valor do parâmetro mode = “show” ).

<% objRec2.Close Set objRec2 = Nothing s objConn.Close Set objConn = Nothing Response.Write "

" %>

Conclusão

Consideramos mais um componente funcional do site e imediatamente o tornamos portátil. O resultado disso foi um código-fonte bastante complexo em termos de percepção. Embora um grande número de parâmetros recuperados da tabela administrativa tenha dificultado um pouco a compreensão do código-fonte do módulo, no entanto, usá-los de uma vez por todas evitará que você precise editar o código quando eles forem alterados. O sistema desenvolvido por nós é bastante aceitável em uso e, graças à modularidade de sua implementação e à abordagem de sua implementação em sites existentes descritos no artigo, pode ser usado como um livro de visitas em um site de quase qualquer grau de complexidade .

Obviamente, a interface da Web para editar, adicionar e excluir configurações administrativas (esquemas) também deve ser considerada, mas isso levará muito tempo e, portanto, o autor tentará cobri-lo em uma das seguintes partes deste artigo.

ComputerPress 11 "2001

O registro de controles é realizado pela diretiva @Register, que permite usar controles de usuário e controles de servidor no código HTML da página usando uma sintaxe especial (sintaxe declarativa de controle de servidor personalizado). Com base na análise dessas diretivas, o analisador de página pode associar tags a determinados tipos e, ao criar uma página, incorporar controles já como contêineres de tipos personalizados - ramificações da árvore de controle da página.

As diretivas devem preceder o primeiro uso das tags declaradas, mais frequentemente elas são colocadas no início da página e no caso de registrar vários controles, em sites com estrutura modular, a quantidade dessas declarações pode ocupar um grande número de linhas . Ao alterar a localização dos controles, você deve procurar as linhas que exigem alterações no código de todas as páginas e controles de usuário nos quais estão registrados, o que é bastante inconveniente.

O artigo descreve um método que simplifica o registro de controles.

Para as diretivas de registro, usaremos um arquivo de texto simples no qual coletaremos todas as diretivas @ Register. Como os caminhos virtuais podem ser usados ​​para declarar controles de usuário e apenas namespaces são especificados para controles de servidor, podemos coletar todos os links que precisamos neste arquivo, e os links para os arquivos ascx estarão corretos para qualquer pasta no projeto. Aqui está a aparência deste arquivo em um dos projetos:


<%@ Register TagPrefix="ch" Namespace="ControlsSharp.HtmlControls" Assembly="ControlsSharp"%>

<%@ Register TagPrefix="cw" Namespace="ControlsSharp.WebControls" Assembly="ControlsSharp"%>

<%@ Register TagPrefix="c" Namespace="ControlsSharp.CustomControls" Assembly="ControlsSharp"%>

<%@ Register TagPrefix="b" Namespace="ControlsBasic.CustomControls" Assembly="ControlsBasic"%>

<%@ Register TagPrefix="cu" TagName="bottommenu" Src="~/UserControls/Menu/cu_menu_bottom.ascx" %>

<%@ Register TagPrefix="cu" TagName="leftmenu" Src="~/UserControls/Menu/cu_menu_left.ascx" %>

<%@ Register TagPrefix="cu" TagName="topmenu" Src="~/UserControls/Menu/cu_menu_top.ascx" %>

Vamos nomear o arquivo register.inc e colocá-lo na pasta /inc do nosso projeto web.

Este arquivo conterá todos os links que precisamos, adicionaremos ou alteraremos o registro de um usuário ou controle de servidor nele.

Agora o arquivo criado precisa ser incluído de alguma forma no código da página. Fazemos isso com a diretiva #include SSI (server side includes). Esta diretiva permite incluir arquivos estáticos e dinâmicos no código da página, processando-os com base no mapeamento do IIS, ou seja, especificar um arquivo asp ou aspx como a origem fará com que o arquivo seja processado pelo processo apropriado e copie os resultados desse processamento para a página de saída. Em ASP, a diretiva #include foi muito utilizada e permitiu a modularização do site. Com o advento do ASP.NET, tornou-se mais conveniente fazer isso de outras maneiras, por exemplo, usando controles de usuário. Versões futuras do ASP.NET implementarão a modularidade usando páginas mestras. Em geral, a diretiva #include perdeu seu significado e foi mantida principalmente para compatibilidade com versões anteriores e para simplificar a migração de projetos ASP para .Net.

Como temos um arquivo de texto simples, nenhum processamento será feito e, antes que qualquer conteúdo dinâmico seja executado, todo o conteúdo do arquivo será copiado para o código da página. Aqueles. adicionar nosso arquivo register.inc ao topo da página, por exemplo, é quase o mesmo que escrever todas as diretivas @Register ali.

Para não depender da localização física do arquivo, usamos novamente a sintaxe do caminho virtual e adicionamos a seguinte linha ao código do arquivo aspx:

Certifique-se de que tudo funciona, caso contrário, corrija os caminhos errados.

Resta realizar mais uma operação. Agora, se você tentar obter o arquivo /inc/register.inc do link em seu navegador, poderá fazê-lo facilmente. O IIS o coloca em suas mãos, assim como nas mãos de um invasor, totalmente gratuito, embora contenha os caminhos da estrutura física do seu site.

Para evitar que isso aconteça, usamos os recursos do manipulador síncrono HttpForbiddenHandler, que nos permite proteger arquivos de um determinado tipo de serem emitidos a pedido do usuário. Essa abordagem é conveniente e é frequentemente usada, por exemplo, para proteger arquivos de banco de dados do MS Access usados ​​em um projeto. Para que os arquivos com a extensão *.inc sejam protegidos usando esse manipulador, você precisa informar ao IIS que esses arquivos serão processados ​​pelo processo ASP.NET, ou seja, configurar o IIS para mapear para arquivos desse tipo.

Para obter uma descrição detalhada do processo de configuração do IIS, consulte COMO: Usar ASP.NET para proteger tipos de arquivo (http://support.microsoft.com/kb/815152/EN-US/). Precisamos criar um mapeamento apenas para arquivos *.inc. Após concluir os passos descritos lá, todas as solicitações de arquivos com essa extensão serão processadas pelo processo ASP.NET, e você terá que editar o arquivo web.config da seguinte forma:

É isso, agora ao tentar obter o arquivo /inc/register.inc através de um link direto, o usuário receberá o erro B.

Para não registrar aspnet_isapi.dll, por exemplo, seu provedor não quer fazer isso, você pode usar a habilidade SSI para especificar arquivos de qualquer tipo e trapacear usando uma extensão de um dos tipos já mapeados no IIS por padrão para um arquivo com diretivas @Register. As extensões *.cs ou *.vb serão convenientes para isso. Esses arquivos contêm código-fonte e geralmente não são copiados para o servidor. Se de repente você cometeu um erro e copiou, não poderá obtê-los na solicitação do navegador - ao tentar fazer isso, o usuário receberá um erro B. Isso acontece porque o mapeamento no IIS é configurado por padrão para arquivos deste tipo e a extensão correspondente já está registrada na seção arquivo machine.config. No Visual Studio, para que o compilador não dê uma mensagem de erro, coloque uma extensão na qual o compilador não esteja interessado: em projetos C# é *.vb, em projetos VB é *.cs.
Conclusão

O método descrito permite registrar controles em um só lugar para todo o projeto. A modificação subsequente deste arquivo requer menos esforço do que se você tivesse que fazê-lo da maneira usual. Tente usar SSI #include dentro dos arquivos que você insere - isso permite que você organize um tipo de hierarquia e herança, o que pode ser conveniente para grandes projetos

As diretivas no AngularJS desempenham um papel importante. As diretivas podem ser usadas para ensinar novos truques ao HTML, e você pode até criar suas próprias tags ou atributos HTML. As diretivas também ajudam a manter a marcação mais fluente e definem uma boa maneira de separar código e marcação.

View é um modelo HTML. A visualização nada mais é do que as informações que você deseja renderizar para o navegador do usuário final. Uma visão no AngularJS também é chamada de DOM compilado. View faz uso de diretivas para renderizar os dados com template HTML.

Este artigo é a Parte IV do Site de Acompanhamento de Projetos construído em AngularJS e ASP.NET Web API. Até agora, criamos , criamos um e temos .

Graças a para revisar esta série Angular e corrigir os bugs.

Já vimos o objeto $scope que fornece um Model para a View. O código do modelo não é misturado com o código HTML que escrevemos em nossas visualizações. Em vez disso, os dados são movidos do modelo para as exibições usando expressões de vinculação de dados. Dessa forma, os desenvolvedores podem alcançar a Separação de Preocupações (SoC). Como os modelos são independentes das visualizações, eles podem ser vinculados a qualquer visualização. Essa vinculação do modelo é feita com a ajuda das Diretivas AngularJS.

Já vimos algumas diretivas Angular em nosso ng-app que inicializa o AngularJS, bem como o ng-controller que disponibiliza o controlador para HTML. A partir do controlador, podemos vincular os dados às visualizações usando Angular ((expressão)).

Neste artigo, veremos algumas diretivas adicionais do AngularJS que vêm de fábrica com o Angular. Um deles é ng-repetir. Vamos tentar usar a diretiva ng-repeat em nossa página EmployeeDetails.html que pode ser encontrada no anexo deste artigo. Modifique a URL do serviço em nosso arquivo EmployeesController.js. A URL do serviço é a seguinte:

http://localhost:2464/api/ptemployees

Agora vamos modificar a página EmployeeDetails.html conforme mostrado no código a seguir -

((emp.employeeID)) ((emp.employeeName)) ((designação embr.)) ((emp.contatoNº)) ((emp.eMailID)) ((emp.skillSets))

Substitua o da página EmployeeDetails.html com o código acima. A saída do código acima é mostrada aqui:

Neste código, usamos a diretiva ng-repeat do AngularJS. É semelhante ao loop for ou foreach no .NET. Aqui estamos recebendo um IEnumerable coleção usando ASP.NET Web API. Estamos usando esta coleção como modelo em nosso Angular Controller. Usando esse modelo, estamos iterando os objetos dos funcionários em nossa visão. Esta é uma diretiva muito útil que se repete através dos objetos na coleção para exibir os dados na exibição.

Agora vamos tentar adicionar um filtro para pesquisar um funcionário específico da coleção e exibir o funcionário com base no caractere Nome do funcionário ou Nome do funcionário. Até agora, buscamos o modelo e o usamos em nossas Views. Também funciona de outra forma. Podemos fazer com que nossas visualizações falem de volta com nossos modelos que estão em nossos controladores.

Para adicionar um filtro de pesquisa com base no nome do funcionário, modificaremos a página EmployeeDetails.html adicionando elementos de entrada HTML conforme mostrado abaixo -

Digite o nome ou personagem do funcionário para pesquisar -

Adicione o código acima logo após o

marcação. No código acima, estamos usando a diretiva ng-model que nos permite enviar os dados de volta ao modelo. Com base nesses dados, faremos uma busca por um funcionário usando a propriedade EmployeeName. Certifique-se de que a propriedade EmployeeName esteja declarada em nosso modelo, o que faremos nas etapas a seguir. Observe também que estamos usando ng-submit directiva que irá chamar a PesquisaFuncionário função do nosso controlador.

Agora vamos modificar o arquivo EmployeesController.js para que possamos pesquisar o funcionário com base na propriedade EmployeeName como critério de pesquisa. O código é mostrado abaixo -

(function () ( var EmployeesController = function ($scope,$http) ( var employees = function (serviceResp) ( $scope.Employees = serviceResp.data; ); $scope.SearchEmployees = function (EmployeeName) ( $http.get ("http://localhost:2464/api/ptemployees/" + EmployeeName) .then(employees, errorDetails); ); var errorDetails = function (serviceResp) ( $scope.Error="Algo deu errado ??"; ) ;$http.get("http://localhost:2464/api/ptemployees") .then(employees,errorDetails); $scope.Title = "(!LANG:Employee Details Page"; $scope.EmployeeName = null; }; app.controller("EmployeesController", EmployeesController); }()); !}

No código acima, adicionamos o método SearchEmployee() ao nosso objeto $scope como modelo. Este método procurará Funcionários com base no nome do funcionário ou no caractere do nome de um funcionário. Também declaramos Nome do empregado propriedade em nosso controlador no final deste código. O método SearchEmployees busca o método da API da Web. Eu modifiquei o método GET como mostrado aqui:

Public HttpResponseMessage Get(string name) ( var employees = EmployeesRepository.SearchEmployeesByName(name); HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, employees); return response; )

O código do Employee Repository é mostrado aqui:

lista estática pública SearchEmployeesByName(string EmployeeName) ( ProjectTrackingDBEntities dataContext = new ProjectTrackingDBEntities(); var query = de empregado em dataContext.Employees onde empregado.EmployeeName.Contains(employeeName) selecione empregado; return query.ToList(); )

Após todas essas alterações, agora execute a página EmployeeDetails.html e veja a saída.

Na saída acima, estamos procurando funcionários cujo nome contém o caractere 'J'.

Filtros AngularJS estender o comportamento de expressões ou diretivas de ligação. Os filtros são usados ​​com expressões de associação para formatar os dados que estão sendo associados. Quando são usados ​​com diretivas, eles adicionam algumas ações adicionais às diretivas. Pronto para uso, o AngularJS fornece uma série de filtros que podemos usar para formatar os valores de uma expressão e exibir os valores/dados em nossas visualizações. Você pode fazer uso de filtros em Views, Controllers e Services. A sintaxe do uso de filtros em visualizações é ((expressão | filtro1 | filtro2 | ...)).

Vamos agora tentar um filtro que classificará os dados usando o nome do funcionário. Para classificar os dados, vamos adicionar um filtro em nosso ng-repeat usando um | operador como mostrado aqui:

No código acima, estamos adicionando filtro em nossa diretiva ng-repeat. O orderBy:'employeeName' classificará os dados usando o nome do funcionário em ordem crescente. Você pode observar a saída aqui:

Para exibir os dados em ordem decrescente, você pode alterar o filtro conforme mostrado aqui:

No código acima, para classificar os nomes dos funcionários em ordem decrescente, usamos o sinal de menos (-). Da mesma forma, você pode usar o sinal (+) para classificá-lo em ordem crescente.

Você também pode fazer uso limitTo filtro para limitar o número de registros. Por exemplo, digamos que em um momento você deseja exibir 5 funcionários. Para exibir o número restrito de registros em nossa página EmployeeDetails.html, vamos modificar a diretiva ng-repeat conforme mostrado aqui-

A saída é mostrada aqui:

Agora, se você executar a página ProjectDetails.html, a data será exibida com a hora. Você pode aplicar o filtro de data conforme mostrado no código a seguir -

((proj.projectID)) ((proj.projectName)) ((proj.startDate|date:"curta")) ((proj.endDate|date:"curta")) ((proj.clientName))

A saída desta página é a seguinte:

Você pode usar diferentes formatos de data como - fulldate, longdate, mediumdate, shortdate etc. Agora vamos abrir a página EmployeeDetails.html e executá-la. Estou usando o caractere 'Z' para exibir funcionários cujo nome de funcionário contém Z.

Se você observar, a saída exibe um cabeçalho de tabela Employee sem dados. Podemos tornar o título invisível usando a diretiva ng-show quando o filtro não produz nenhum resultado. Aplique a diretiva ng-show em nossa tag table conforme mostrado no código abaixo e tente executar o aplicativo com o caractere Z. Agora você não verá as colunas da tabela quando o modelo Employees for nulo. O atributo ng-show avaliará o modelo Employees e, consequentemente, exibirá a tabela ou ocultará a tabela.

Da mesma forma, existem várias diretivas que você pode usar no AngularJS. Você também pode criar uma Diretiva Personalizada que veremos mais adiante nesta série. Aplique a pesquisa em várias visualizações conforme sua necessidade em nossas visualizações. Em nosso próximo artigo, veremos