Compartilhar via


Criação de um aplicativo do MVC 3 com Razor e JavaScript não obstrusivo

pela Microsoft

O aplicativo Web de exemplo lista de usuários demonstra como é simples criar aplicativos ASP.NET MVC 3 usando o mecanismo de exibição razor. O aplicativo de exemplo mostra como usar o novo mecanismo de exibição razor com ASP.NET MVC versão 3 e Visual Studio 2010 para criar um site fictício da Lista de Usuários que inclui funcionalidades como criar, exibir, editar e excluir usuários.

Este tutorial descreve as etapas que foram executadas para criar o exemplo de Lista de Usuários ASP.NET aplicativo MVC 3. Um projeto do Visual Studio com código-fonte C# e VB está disponível para acompanhar este tópico: Download. Se você tiver dúvidas sobre este tutorial, poste-as no fórum do MVC.

Visão geral

O aplicativo que você criará é um site de lista de usuários simples. Os usuários podem inserir, exibir e atualizar informações do usuário.

Site de exemplo

Você pode baixar o projeto concluído do VB e do C# aqui.

Criando o aplicativo Web

Para iniciar o tutorial, abra o Visual Studio 2010 e crie um novo projeto usando o modelo de Aplicativo Web ASP.NET MVC 3 . Nomeie o aplicativo como "Mvc3Razor".

Novo projeto MVC 3

Na caixa de diálogo Novo projeto ASP.NET MVC 3 , selecione Aplicativo da Internet, selecione o mecanismo de exibição Razor e clique em OK.

Caixa de diálogo Novo projeto ASP.NET MVC 3

Neste tutorial, você não usará o provedor de associação ASP.NET, portanto, poderá excluir todos os arquivos associados ao logon e à associação. Em Gerenciador de Soluções, remova os seguintes arquivos e diretórios:

  • Controllers\AccountController
  • Models\AccountModels
  • Views\Shared\_LogOnPartial
  • Views\Account (e todos os arquivos neste diretório)

Soln Exp

Edite o arquivo _Layout.cshtml e substitua a marcação dentro do <div> elemento chamado logindisplay pela mensagem "Logon Desabilitado". O exemplo a seguir mostra a nova marcação:

<div id="logindisplay">
  Login Disabled
</div>

Adicionando o modelo

Em Gerenciador de Soluções, clique com o botão direito do mouse na pasta Modelos, selecione Adicionar e clique em Classe.

Nova classe MdL de Usuário

Nome da classe UserModel. Substitua o conteúdo do arquivo UserModel pelo seguinte código:

using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;

namespace Mvc3Razor.Models {
    public class UserModel {

        [Required]
        [StringLength(6, MinimumLength = 3)]
        [Display(Name = "User Name")]
        [RegularExpression(@"(\S)+", ErrorMessage = "White space is not allowed")]
        [ScaffoldColumn(false)]
        public string UserName { get; set; }

        [Required]
        [StringLength(8, MinimumLength = 3)]
        [Display(Name = "First Name")]
        public string FirstName { get; set; }
        [Required]
        [StringLength(9, MinimumLength = 2)]
        [Display(Name = "Last Name")]
        public string LastName { get; set; }
        [Required()]
        public string City { get; set; }

    }

    public class Users {

        public Users() {
            _usrList.Add(new UserModel
            {
                UserName = "BenM",
                FirstName = "Ben",
                LastName = "Miller",
                City = "Seattle"
            });
            _usrList.Add(new UserModel
            {
                UserName = "AnnB",
                FirstName = "Ann",
                LastName = "Beebe",
                City = "Boston"
            });
        }

        public List<UserModel> _usrList = new List<UserModel>();

        public void Update(UserModel umToUpdate) {

            foreach (UserModel um in _usrList) {
                if (um.UserName == umToUpdate.UserName) {
                    _usrList.Remove(um);
                    _usrList.Add(umToUpdate);
                    break;
                }
            }
        }

        public void Create(UserModel umToUpdate) {
            foreach (UserModel um in _usrList) {
                if (um.UserName == umToUpdate.UserName) {
                    throw new System.InvalidOperationException("Duplicat username: " + um.UserName);
                }
            }
            _usrList.Add(umToUpdate);
        }

        public void Remove(string usrName) {

            foreach (UserModel um in _usrList) {
                if (um.UserName == usrName) {
                    _usrList.Remove(um);
                    break;
                }
            }
        }

        public  UserModel GetUser(string uid) {
            UserModel usrMdl = null;

            foreach (UserModel um in _usrList)
                if (um.UserName == uid)
                    usrMdl = um;

            return usrMdl;
        }

    }    
}

A UserModel classe representa os usuários. Cada membro da classe é anotado com o atributo Required do namespace DataAnnotations . Os atributos no namespace DataAnnotations fornecem validação automática do lado do cliente e do servidor para aplicativos Web.

Abra a HomeController classe e adicione uma using diretiva para que você possa acessar as UserModel classes e Users :

using Mvc3Razor.Models;

Logo após a HomeController declaração, adicione o seguinte comentário e a referência a uma Users classe:

public class HomeController : Controller {

// The __usrs class is replacement for a real data access strategy.
private static Users _usrs = new Users();

A Users classe é um armazenamento simplificado de dados na memória que você usará neste tutorial. Em um aplicativo real, você usaria um banco de dados para armazenar informações do usuário. As primeiras linhas do HomeController arquivo são mostradas no exemplo a seguir:

using System.Web.Mvc;
using Mvc3Razor.Models;

namespace Mvc3Razor.Controllers {
       
    public class HomeController : Controller {

        // The __usrs class is replacement for a real data access strategy.
        private static Users _usrs = new Users();

Crie o aplicativo para que o modelo de usuário esteja disponível para o assistente de scaffolding na próxima etapa.

Criando o modo de exibição padrão

A próxima etapa é adicionar um método de ação e exibir para exibir os usuários.

Exclua o arquivo Views\Home\Index existente. Você criará um novo arquivo Index para exibir os usuários.

HomeController Na classe , substitua o conteúdo do Index método pelo seguinte código:

return View(_usrs._usrList);

Clique com o botão direito do mouse dentro do Index método e clique em Adicionar Exibição.

Adicionar Exibição

Selecione a opção Criar uma exibição fortemente tipada . Para Exibir classe de dados, selecione Mvc3Razor.Models.UserModel. (Se você não vir Mvc3Razor.Models.UserModel na caixa Exibir classe de dados , precisará compilar o projeto.) Verifique se o mecanismo de exibição está definido como Razor. Defina Exibir conteúdo como Lista e clique em Adicionar.

Adicionar Exibição de Índice

A nova exibição scaffolds automaticamente os dados do usuário que são passados para o modo de exibição Index . Examine o arquivo Views\Home\Index recém-gerado. Os links Criar Novo, Editar, Detalhes e Excluir não funcionam, mas o restante da página está funcional. Execute a página. Você vê uma lista de usuários.

Página índice

Abra o arquivo Index.cshtml e substitua a ActionLink marcação de Editar, Detalhes e Excluir pelo seguinte código:

@Html.ActionLink("Edit", "Edit", new {  id=item.UserName  }) |
@Html.ActionLink("Details", "Details", new {  id=item.UserName  }) |
@Html.ActionLink("Delete", "Delete", new {  id=item.UserName  })

O nome de usuário é usado como a ID para localizar o registro selecionado nos links Editar, Detalhes e Excluir .

Criando a exibição detalhes

A próxima etapa é adicionar um Details método de ação e exibição para exibir os detalhes do usuário.

A captura de tela mostra os Campos de Detalhes com UserName, FirstName, LastName e City para um usuário.

Adicione o seguinte Details método ao controlador inicial:

public ViewResult Details(string id) {
    return View(_usrs.GetUser(id));
}

Clique com o botão direito do mouse dentro do Details método e selecione Adicionar Exibição. Verifique se a caixa Exibir classe de dados contém Mvc3Razor.Models.UserModel. Defina Exibir conteúdo como Detalhes e clique em Adicionar.

Adicionar exibição de detalhes

Execute o aplicativo e selecione um link de detalhes. O scaffolding automático mostra cada propriedade no modelo.

Captura de tela que mostra os Campos de Detalhes com valores para um usuário.

Criando o modo de exibição Editar

Adicione o método a seguir Edit ao controlador inicial.

public ViewResult Edit(string id) {
    return View(_usrs.GetUser(id));
}

[HttpPost]
public ViewResult Edit(UserModel um) {

    if (!TryUpdateModel(um)) {
        ViewBag.updateError = "Update Failure";
        return View(um);
    }

    // ToDo: add persistent to DB.
    _usrs.Update(um);
    return View("Details", um);
}

Adicione uma exibição como nas etapas anteriores, mas defina Exibir conteúdo como Editar.

Adicionar modo de exibição Editar

Execute o aplicativo e edite o nome e o sobrenome de um dos usuários. Se você violar quaisquer DataAnnotation restrições que tenham sido aplicadas à UserModel classe , ao enviar o formulário, verá erros de validação produzidos pelo código do servidor. Por exemplo, se você alterar o nome "Ann" para "A", ao enviar o formulário, o seguinte erro será exibido no formulário:

The field First Name must be a string with a minimum length of 3 and a maximum length of 8.

Neste tutorial, você está tratando o nome de usuário como a chave primária. Portanto, a propriedade de nome de usuário não pode ser alterada. No arquivo Edit.cshtml , logo após a Html.BeginForm instrução , defina o nome de usuário como um campo oculto. Isso faz com que a propriedade seja passada no modelo. O fragmento de código a seguir mostra o posicionamento da Hidden instrução :

<h2>Edit</h2>
    @using (Html.BeginForm()) {
@Html.Hidden("UserName", Model.UserName)

Substitua a TextBoxFor marcação e ValidationMessageFor pelo nome de usuário por uma DisplayFor chamada. O DisplayFor método exibe a propriedade como um elemento somente leitura. O exemplo a seguir mostra a marcação concluída. As chamadas originais TextBoxFor e ValidationMessageFor são comentadas com os caracteres de início e comentário do Razor (@* *@)

<div class="editor-label">
  @Html.LabelFor(model => model.UserName)
</div>

<div class="editor-field">
@*
  @Html.TextBoxFor(model => model.UserName)
  @Html.ValidationMessageFor(model => model.UserName)
*@
@Html.DisplayFor(model => model.UserName)
</div>

Habilitando a validação de Client-Side

Para habilitar a validação do lado do cliente no ASP.NET MVC 3, você deve definir dois sinalizadores e incluir três arquivos JavaScript.

Abra o arquivo deWeb.config do aplicativo. Verifique that ClientValidationEnabled e UnobtrusiveJavaScriptEnabled se estão definidos como true nas configurações do aplicativo. O fragmento a seguir do arquivo deWeb.config raiz mostra as configurações corretas:

<appSettings>
  <add key="ClientValidationEnabled" value="true"/> 
  <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
 </appSettings>

A configuração UnobtrusiveJavaScriptEnabled como true permite a validação discreta do Ajax e do cliente discreto. Quando você usa a validação não discreta, as regras de validação são transformadas em atributos HTML5. Os nomes de atributo HTML5 podem consistir apenas em letras minúsculas, números e traços.

A configuração ClientValidationEnabled como true habilita a validação do lado do cliente. Ao definir essas chaves no arquivo deWeb.config do aplicativo, você habilita a validação do cliente e o JavaScript discreto para todo o aplicativo. Você também pode habilitar ou desabilitar essas configurações em exibições individuais ou em métodos de controlador usando o seguinte código:

HtmlHelper.ClientValidationEnabled = true; 
HtmlHelper.UnobtrusiveJavaScriptEnabled = true;

Você também precisa incluir vários arquivos JavaScript na exibição renderizada. Uma maneira fácil de incluir o JavaScript em todos os modos de exibição é adicioná-los ao arquivo Views\Shared\_Layout.cshtml . Substitua o <head> elemento do arquivo _Layout.cshtml pelo seguinte código:

<head>
  <title>@View.Title</title>
  <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
  <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.4.2.min.js"></script>
  <script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.7/jquery.validate.min.js"></script>
  <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
</head>

Os dois primeiros scripts jQuery são hospedados pela CDN (Rede de Distribuição de Conteúdo) do Microsoft Ajax. Aproveitando a CDN do Microsoft Ajax, você pode melhorar significativamente o desempenho de seus aplicativos.

Execute o aplicativo e clique em um link de edição. Exiba a origem da página no navegador. A origem do navegador mostra muitos atributos do formulário data-val (para validação de dados). Quando a validação do cliente e o JavaScript discreto estão habilitados, os campos de entrada com uma regra de validação de cliente contêm o data-val="true" atributo para disparar a validação de cliente não discreta. Por exemplo, o City campo no modelo foi decorado com o atributo Required , o que resulta no HTML mostrado no exemplo a seguir:

<div class="editor-field">
  <input data-val="true" data-val-required="The City field is required." id="City" name="City" type="text" value="Seattle" />
  <span class="field-validation-valid" data-valmsg-for="City" data-valmsg-replace="true"></span>
</div>

Para cada regra de validação de cliente, um atributo é adicionado que tem o formulário data-val-rulename="message". Usando o exemplo de City campo mostrado anteriormente, a regra de validação de cliente necessária gera o data-val-required atributo e a mensagem "O campo Cidade é necessário". Execute o aplicativo, edite um dos usuários e limpe o City campo. Ao sair do campo, você verá uma mensagem de erro de validação do lado do cliente.

Cidade necessária

Da mesma forma, para cada parâmetro na regra de validação de cliente, um atributo é adicionado que tem o formato data-val-rulename-paramname=paramvalue. Por exemplo, a FirstName propriedade é anotada com o atributo StringLength e especifica um comprimento mínimo de 3 e um comprimento máximo de 8. A regra de validação de dados chamada length tem o nome max do parâmetro e o valor do parâmetro 8. O seguinte mostra o HTML gerado para o FirstName campo quando você edita um dos usuários:

<input data-val="true"         
       data-val-length="The field First Name must be a string with a minimum length of 3 and a maximum length of 8." 
       data-val-length-max="8" 
       data-val-length-min="3" 
       data-val-required="The First Name field is required." 
       id="FirstName" 
       name="FirstName" 
       type="text" 
       value="Ben" />

Para obter mais informações sobre a validação de cliente não discreta, consulte a entrada Validação de cliente não discreta no ASP.NET MVC 3 no blog de Brad Wilson.

Observação

No ASP.NET MVC 3 Beta, às vezes você precisa enviar o formulário para iniciar a validação do lado do cliente. Isso pode ser alterado para a versão final.

Criando o modo de exibição Criar

A próxima etapa é adicionar um Create método de ação e exibição para permitir que o usuário crie um novo usuário. Adicione o seguinte Create método ao controlador inicial:

public ViewResult Create() {
    return View(new UserModel());
}

[HttpPost]
public ViewResult Create(UserModel um) {

    if (!TryUpdateModel(um)) {
        ViewBag.updateError = "Create Failure";
        return View(um);
    }

    // ToDo: add persistent to DB.
    _usrs.Create(um);
    return View("Details", um);
}

Adicione um modo de exibição como nas etapas anteriores, mas defina Exibir conteúdo como Criar.

Criar Exibição

Execute o aplicativo, selecione o link Criar e adicione um novo usuário. O Create método aproveita automaticamente a validação do lado do cliente e do lado do servidor. Tente inserir um nome de usuário que contenha espaço em branco, como "Ben X". Quando você sai do campo nome de usuário, um erro de validação do lado do cliente (White space is not allowed) é exibido.

Adicionar o método Delete

Para concluir o tutorial, adicione o seguinte Delete método ao controlador inicial:

public ViewResult Delete(string id) {
    return View(_usrs.GetUser(id));
}

[HttpPost]
public RedirectToRouteResult Delete(string id, FormCollection collection) {
    _usrs.Remove(id);
    return RedirectToAction("Index");
}

Adicione um modo Delete de exibição como nas etapas anteriores, definindo Exibir conteúdo como Excluir.

Excluir Exibição

Agora você tem um aplicativo MVC 3 ASP.NET simples, mas totalmente funcional, com validação.