Este artigo foi traduzido por máquina.

Extreme ASP.NET

Olhando para o futuro do ASP.NET 4.0

K. Scott Allen

Quando o Visual Studio 2010 e .NET 4.0 chegarem próximo ano, podemos ASP.NET desenvolvedores terão duas amadurecer estruturas para a criação de aplicativos: a estrutura ASP.NET Web Forms e o ASP.NET MVC framework. Tanto criar na parte superior de tempo de execução do ASP.NET principais e ambos estão obtendo alguns recursos novos para iniciar a próxima década.

Não tenho espaço para abordar cada adição para ASP.NET em um artigo, como há vários aprimoramentos para estruturas e o tempo de execução subjacente. Em vez disso, eu irá realçar Acho que são importantes novos recursos para Web Forms e MVC.

Novo for ASP.NET Web Forms

ASP.NET Web Forms será antigos pelo tempo que Microsoft lança versão 4 por oito anos e a equipe continua refinar a estrutura e fazer aprimoramentos. Na minha última coluna, eu utilizadas alguns desses aprimoramentos, como as novas classes que tornam fácil de usar os recursos de roteamento de URL agora incluídos nos serviços principais do ASP.NET e as novas propriedades MetaKeywords e MetaDescription na classe base Page tornar simples para controlam o conteúdo de marcas META em um formulário. Essas alterações são relativamente pequenas, entretanto.

Principais alterações nos Web Forms endereço alguns chefe críticas sobre a estrutura. Muitos desenvolvedores têm queria mais controle sobre o HTML um formulário da Web e produzirem seus controles, incluindo os identificadores de cliente emitidos dentro do HTML. No 4.0, muitos dos controles do lado do servidor do ASP.NET foram reformulados para produzir HTML que é mais fácil de estilo com CSS e sigam práticas Web convencionais.  Além disso, novas propriedades foram adicionadas para classes base dará aos desenvolvedores mais controle sobre os identificadores de cliente gerado pela estrutura. Eu irá destacar essas alterações nas seções a seguir.

CSS Friendly HTML

O controle de menu do ASP.NET é um exemplo de um controle de servidor notoriamente difíceis de estilo com CSS. Quando o menu processa, emite marcas de tabela aninhada que incluem atributos cellpadding, cellspacing e borda. Para piorar, o controle menu incorpora informações de estilo dentro das células de tabelas aninhadas e injeta um bloco de estilo em linha na parte superior da página. Por exemplo, examine a seguinte definição de um menu simples:

<asp:Menu runat="server" ID="_menu">
    <Items>
        <asp:MenuItem Text="Home" NavigateUrl="~/Default.aspx" />
        <asp:MenuItem Text="Shop" NavigateUrl="~/Shop.aspx" />
    </Items>
</asp:Menu>

No ASP.NET 3.5, o menu simples produz o seguinte HTML (com alguns atributos omitido ou reduzida para maior clareza):

<table class="..." cellpadding="0" cellspacing="0" border="0">
    <tr id="_menun0">
        <td>
            <table cellpadding="0" cellspacing="0" 
                border="0" width="100%">
                <tr>
                    <td style="...">
                        <a class="..." href="Default.aspx">Home</a>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</table>

No ASP.NET 4.0, Microsoft revisado o controle menu para produzir marcação semântica. O mesmo controle de menu no ASP.NET 4.0 produzirá o seguinte HTML:

<div id="_menu">
    <ul class="level1">
        <li><a class="level1" href="Default.aspx" target="">Home</a></li>
    </ul>
</div>

Esse tipo de marcação amigável para CSS foi obtido em versões anteriores do ASP.NET se usado um adaptador de controle para fornecer lógica de renderização alternativo para um controle, mas agora a marcação é amigável para CSS por padrão. Se você já tem folhas de estilo e o script de cliente escrito contra HTML produzido pelo ASP.NET 3.5, você pode definir o atributo controlRenderingCompatibilityVersion da seção páginas no web.config para o valor “ 3.5 ” e o controle produzirá a marcação de tabela aninhada vimos anteriormente. O valor padrão para este atributo é 4.0. Observe que o controle 4.0 menu ainda produz um bloco style na parte superior da página mas desative essa opção, definindo a propriedade IncludeStyleBlock do controle como false.

Muitos controles 4.0 também são CSS amigáveis. Por exemplo, controles de validação como RangeValidator e RequiredFieldValidator não processará mais estilos embutidos e controles de modelo como o controle FormView, o logon e o assistente não processará mais próprios dentro de uma marca de tabela (mas somente se você definir a propriedade RenderOuterTable nesses controles para false). Outros controles foram alteradas, muito. Como apenas um exemplo, você pode forçar os controles RadioButtonList e CheckBoxList para processar suas entradas dentro de elementos de lista, definindo a propriedade RepeatLayout para valor OrderedList ou UnorderedList, força os controles para processar usando ol e elementos li, respectivamente.

Gerando identificações de cliente

Se você nunca tenha escrito o script do lado do cliente para manipular o DOM, são provavelmente atento a afinidade do ASP.NET para alterar os atributos de identificação do lado do cliente. Em um esforço para garantir que todos os atributos de identificação exclusivos em uma página, o ASP.NET irá gerar uma identificação de cliente concatenando a propriedade ID do controle com informações adicionais. No servidor, você pode acessar o valor gerado usando a propriedade ClientID de um controle.

Por exemplo, se um controle está dentro de um contêiner de nomeação (um controle que implementa a interface INamingContainer como controles de usuário e páginas mestras), em seguida, ASP.NET produz o valor ClientID pela colocação de um prefixo identificação do contêiner de nomeação a identificação. do controle Para controles ligados a dados que processam repetição blocos de HTML, ASP.NET irá adicionar um prefixo inclui números seqüenciais. Se você exibir a origem de qualquer página do ASP.NET, você provavelmente encontrará valores de id como “ ctl00_content_ctl20_ctl00_loginlink ”. Esses valores gerados adicionam um nível extra de dificuldade ao escrever script de cliente para uma página de Web Forms.

No Web Forms 4.0, uma nova propriedade ClientIDMode é cada controle. Você pode usar essa propriedade para influenciar o algoritmo que ASP.NET usará para gerar o valor do controle ClientID. Definindo o valor para static informa ao ASP.NET para usar identificação do controle como seu ClientID com nenhum concatenação ou colocação de um prefixo. Por exemplo, CheckBoxList no código a seguir irá gerar uma marca < ol > com uma identificação de cliente de “ checklist ”, independentemente de onde existe o controle na página:

<asp:CheckBoxList runat="server" RepeatLayout="OrderedList" 
                  ID="checklist" ClientIDMode="Static">
    <asp:ListItem>Candy</asp:ListItem>
    <asp:ListItem>Flowers</asp:ListItem>
</asp:CheckBoxList>

Ao usar um ClientIDMode de estático, você precisará garantir que os identificadores de cliente são exclusivos. Se existirem valores em uma página de identificação duplicado, você vai quebrar efetivamente qualquer scripts procurando por elementos DOM por seu valor de identificação.

Existem três valores adicionais disponíveis para a propriedade ClientIDMode. O valor previsíveis é útil para controles implementando IDataBoundListControl como GridView e ListView. Usar o valor previsível em conjuˆnction com a propriedade ClientIDRowSuffix desses controles para gerar identificações de cliente com valores específicos como sufixo para o final da identificação. Por exemplo, ListView seguinte irá vincular a uma lista de objetos do funcionário. Cada objeto tem propriedades CódigoDoFuncionário e IsSalaried. A combinação das propriedades ClientIDMode e ClientIDRowSuffix dizer CheckBox para gerar uma identificação de cliente como employeeList_IsSalaried_10, onde 10 representa a identificação. do funcionário associado

<asp:ListView runat="server" ID="employeeList" 
                      ClientIDMode="Predictable"
                      ClientIDRowSuffix="EmployeeID">
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="IsSalaried" 
                              Checked=<%# Eval("IsSalaried") %> />
            </ItemTemplate>
        </asp:ListView>

Outro valor possível para ClientIDMode é herdar. Todos os controles em uma página usam um ClientIDMode de herança por padrão. Herdar significa que o controle usará ClientIDMode mesmo pai. No exemplo de código anterior, o CheckBox herda seu valor ClientIDMode de ListView, que contém o valor previsíveis. O valor final possível para ClientIDMode é AutoID. AutoID informa ao ASP.NET para usar o mesmo algoritmo para gerar propriedade ClientID como na versão 3.5. O valor padrão para a propriedade de ClientIDMode da página é AutoID. Desde que todos os controles em uma página padrão para usando um ClientIDMode de herança, mover um aplicativo ASP.NET existente para 4.0 não irá alterar o algoritmo que o runtime usa para gerar valores de ID de cliente até que você faça uma alteração a uma propriedade ClientIDMode. Esta propriedade também pode ser definida na seção páginas do web.config para fornecer um padrão diferente para todas as páginas em um aplicativo.

Novo modelo de projeto

O aplicativo Web e modelos de projeto de site no Visual Studio 2008 fornecem uma página Default.aspx, um arquivo web.config e uma pasta App_Data. Esses modelos iniciando são simples e requerem algum trabalho adicional antes você pode começar em um aplicativo real. Os modelos no Visual Studio 2010 mesmos fornecem mais a infra-estrutura que necessário para criar um aplicativo usando práticas contemporâneas. Do Figura 1 mostra uma captura de tela de um aplicativo totalmente novo produzido por esses modelos.

New Web Application in Visual Studio 2010

Figura 1 do novo aplicativo Web no Visual Studio 2010

Observe como o novo aplicativo inclui uma página mestra por padrão (Site.master). Todos os arquivos .aspx que encontrar dentro do novo projeto será páginas de conteúdo usando controles ContentPlaceholder para conecte conteúdo estrutura definida por página mestra. Observe que o novo projeto também inclui uma folha de estilo no diretório de conteúdo (Site.css). A página mestra inclui esta folha de estilo usando uma marca de link e folha de estilos você encontrará um número de estilos definidos para controlar a aparência do corpo da página, títulos, layout primário e mais. Novo projeto também inclui um diretório de scripts com a versão mais recente da biblioteca jQuery, uma estrutura de JavaScript Abrir origem oficialmente suportada pela Microsoft e incluído com o Visual Studio 2010 como parte da instalação.

Novo modelo de projeto, com seu uso de páginas mestras e folhas de estilo, ajudará os desenvolvedores começar na direção certa quando usando Web Forms. Uma versão em execução do novo aplicativo é mostrada no do Figura 2. Visual Studio 2010 também incluirá modelos “ Empty ” para sites e aplicativos. Esses modelos vazios não incluirá arquivos ou diretórios quando usá-los, portanto, você irá iniciar o seu aplicativo do zero.

Running the new ASP.NET Application

Figura 2 Running novo aplicativo ASP.NET

Outro bit de boa notícia sobre novos projetos ASP.NET 4.0 é que o arquivo web.config começa quase vazio. A maior parte da configuração nós se tornou acostumados a ver arquivos web.config de ASP.NET 3.5 agora está no arquivo machine.config vive sob o diretório de instalação do framework 4.0. Isso inclui a configuração de controles do diretório System.Web.Extensions, manipuladores e módulos configurados para oferecer suporte 
JavaScript proxies para serviços da Web e a seção system.webserver para sites em execução no IIS 7.

Nova para o ASP.NET MVC

Visual Studio 2010 devem trazer com a segunda versão do ASP.NET MVC framework. Enquanto ainda jovem a estrutura tem atraído muitos desenvolvedores Web que desejavam uma estrutura projetada para capacidade de teste. A segunda versão da ASP.NET MVC é nos concentrar em melhor produtividade do desenvolvedor e adicionando a infra-estrutura para manipular grandes, projetos de escala empresarial.

Áreas

Uma abordagem para a criação de um aplicativo ASP.NET Web Forms extremamente grande é dividir o aplicativo em vários subprojetos (uma abordagem promovido pela P & P Web Client Composite Library). Essa abordagem é difícil empreender com ASP.NET MVC 1.0 porque funciona contra um número de convenções MVC. 2.0 MVC oferecerá suporte oficialmente esse cenário usando o conceito de uma área do . Uma área do permite particionar um aplicativo MVC em projetos de aplicativos Web ou em diretórios inside of um único projeto. Áreas ajudam a separar logicamente diferentes partes do mesmo aplicativo para melhor sustentabilidade.

Área pai de um aplicativo MVC é um projeto do MVC que incluirá um arquivo web.config de nível global.asax e raiz do aplicativo. Área pai também pode incluir partes comuns de conteúdo, como folhas de estilo de aplicativo, bibliotecas JavaScript e páginas mestras. Áreas filho também são projetos de aplicativos Web do MVC, mas desde que esses projetos fisicamente existirem sob o projeto de área pai em tempo de execução, o pai e seus filhos aparecerá como um único aplicativo.

Por exemplo, imagine um aplicativo grande estoque. Adição para a área pai, o aplicativo de estoque pode ser dividido em ordenação, distribuir, relatórios e áreas administrativas. Cada área pode viver em um projeto de web do MVC separado e cada projeto precisará registrar suas rotas, incluindo uma classe que deriva da classe base abstrata AreaRegistration. No código a seguir, podemos substituir a propriedade NomeDaÁrea para retornar o nome amigável da área de relatórios e substituir o método RegisterArea para definir as rotas disponíveis na área Relatórios:

public class ReportingAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get { return "Reporting"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            // route name
            "ReportingDefault",
            // url pattern
            "reporting/{controller}/{action}",
            // route defaults
            new { controller = "Home", action = "Index" },
            // namespaces
            new string[] { "Reporting.Controllers" });            
    }
}

Observe que incluímos uma matriz de seqüência de caracteres dos namespaces para pesquisar quando localizar o controlador para a área relatórios. Restringir os namespaces para pesquisar permite áreas diferentes para ter controladores com o mesmo nome (HomeController várias classes podem existir no aplicativo, por exemplo).

DataAnnotations para validação fácil

DefaultModelBinder no ASP.NET MVC é responsável por movendo dados do ambiente de solicitação para propriedades de modelo. Por exemplo, quando o fichário de modelo vê um objeto de modelo com uma propriedade denominada Title, ele procurará por meio do formulário, seqüência de consulta e servidor variáveis para localizar uma variável com um nome correspondente (título). No entanto, o fichário de modelo não executa quaisquer verificações de validação além conversões de tipo simples. Se você desejar que a propriedade Title do seu objeto de modelo para conter somente seqüências com 50 caracteres ou menos, ter que executar esta verificação de validação durante a execução de sua ação do controlador, implementar um fichário de modelo personalizado ou implementar a interface IDataErrorInfo no seu modelo.

No ASP.NET 2.0 MVC, o DefaultModelBinder irá examinar os atributos de DataAnnotation em objetos de modelo. Esses atributos de DataAnnotation permitem fornecer restrições de validação no seu modelo. Por exemplo, considere a seguinte classe de filme:

public class Movie
{
    [Required(ErrorMessage="The movie must have a title.")]
    [StringLength(50, ErrorMessage="The movie title is too long.")]
    public string Title { get; set; }
}

Os atributos de propriedade Title diga o fichário de modelo que o título é um campo obrigatório e o comprimento máximo da seqüência é de 50 caracteres. O MVC framework pode exibir automaticamente o texto ErrorMessage no navegador quando a validação falhar. Atributos adicionais de validação internas incluem um atributo para verificar um intervalo e um atributo para corresponder à expressão regular.

No momento da redação deste artigo, o runtime MVC usa somente os atributos de validação para verificações de validação do lado do servidor. A equipe MVC espera gerar lógica de validação do lado do cliente de atributos validação pelo tempo libera MVC 2.0. Orientando tanto o servidor e de cliente validação usando esses atributos será um benefício para manutenção de um aplicativo.

Auxiliares modelados

Auxiliares modelados no ASP.NET MVC 2.0 também consumam atributos de DataAnnotation. Mas em vez de usar atributos para unidade lógica de validação, auxiliares de modelo, use os atributos para a exibição de IU de um modelo de unidade. Auxiliares modelo começam com os métodos auxiliares HTML novos DisplayFor e EditorFor. Esses métodos auxiliares irão localizar modelos para um determinado modelo com base no tipo do modelo. Por exemplo, use a classe Movie que vimos antes, mas com uma propriedade adicional let’s:

public class Movie
{        
    // ...

    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }
}

Nesse cenário, cada filme executa sua data de lançamento, mas ninguém jamais se importa que hora do dia em que um filme é liberado. Só queremos exibir as informações de data ao exibir essa propriedade e não as informações de tempo. Observe que a propriedade é decorada com um atributo de DataType anuncia nossa intenção.

Para exibir corretamente a data de lançamento, precisamos de um modelo de exibição. Um modelo de exibição é apenas um modo de exibição parcial com uma extensão.ascx reside dentro de uma pasta DisplayTemplates. A própria pasta DisplayTemplates pode live sob a pasta de exibição do controlador (caso em que o modelo aplica somente a modos de exibição para que um controlador) ou na pasta exibições compartilhadas (caso em que o modelo está disponível em todos os lugares). Nesse caso, o modelo precisa do nome Date.ascx e a seguinte aparência:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%= Html.Encode(String.Format("{0:d}", Model)) %>

Ordem da estrutura MVC usar este modelo, precisamos usar o método auxiliar de DisplayFor quando a propriedade ReleaseDate de processamento. O código mostrado na do Figura 3 é de outro modelo, modelo de exibição Movie.ascx.

Figura 3 do modelo de exibição de Movie.ascx

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<Movie>" %>

    <fieldset>
        <legend>Fields</legend>
        <p>
            Title:
            <%= Html.LabelFor(m => m.Title) %>
            <%= Html.DisplayFor(m => m.Title) %>
        </p>
        <p>
            <%= Html.LabelFor(m => m.ReleaseDate) %>
            <%= Html.DisplayFor(m => m.ReleaseDate) %>
        </p>
    </fieldset>

Observe como os métodos auxiliares LabelFor e DisplayFor são fortemente tipados, que pode ajudar você propagar alterações se um modelo refatorado. Para usar o modelo Movie.ascx para exibir um filme em qualquer lugar em um aplicativo, precisamos apenas usar o auxiliar DisplayFor novamente. O código a seguir é de uma exibição é digitada altamente contra a classe de filme:

<asp:Content ID="detailContent" 
             ContentPlaceHolderID="MainContent" 
             runat="server">                    
        Movie:
        <%= Html.DisplayFor(m => m) %>
        
    </p>
</asp:Content>

Método DisplayFor é digitado altamente para usar o mesmo modelo como a página de exibição, portanto, o parâmetro m na expressão lambda DisplayFor é do tipo filme. DisplayFor usará automaticamente o modelo Movie.ascx ao exibir o filme (que por sua vez usa um DisplayFor para localizar o modelo Date.ascx). Se nós não usou o atributo DataType propriedade ReleaseDate de um filme, DisplayFor não usaria o modelo Date.ascx e exibirá a data e partes de ReleaseDate o tempo, mas o atributo DataType ajuda a orientar a estrutura para o modelo correto. Esse conceito de modelos fortemente tipados, aninhados e anotações de tipo de dados é poderoso e irá provar para ser um aumento de produtividade.

K.Scott Allené um membro da equipe técnica da Pluralsight e fundador da OdeToCode. Você pode alcançar Scott em scott@OdeToCode.com de ou ler seu blog em odetocode.com/blogs/scottde .

Graças aos seguintes especialistas técnicos para revisão deste artigo: Phil Haack e Matthew Osborn

Envie suas dúvidas e comentários para xtrmasp@microsoft.com de.