Adicionando um novo controlador

por Rick Anderson

Observação

Uma versão atualizada deste tutorial está disponível aqui usando a versão mais recente do Visual Studio. O novo tutorial usa ASP.NET Core MVC, que fornece muitas melhorias ao longo deste tutorial.

Este tutorial ensina a usar o ASP.NET Core MVC com controladores e exibições. O Razor Pages é uma nova alternativa no ASP.NET Core, um modelo de programação baseado em página que torna a criação da interface do usuário da Web mais fácil e produtiva. Recomendamos que você experimente o tutorial do Razor Pages antes da versão do MVC. O tutorial Páginas do Razor:

  • É mais fácil de acompanhar.
  • Aborda mais recursos.
  • É a abordagem preferencial para o desenvolvimento de novos aplicativos.

MVC significa model-view-controller. O MVC é um padrão para desenvolver aplicativos bem arquitetos, testáveis e fáceis de manter. Os aplicativos baseados em MVC contêm:

  • M odels: classes que representam os dados do aplicativo e que usam a lógica de validação para impor regras de negócios para esses dados.
  • V iews: arquivos de modelo que seu aplicativo usa para gerar dinamicamente respostas HTML.
  • Controladores C: classes que lidam com solicitações de navegador de entrada, recuperam dados de modelo e especificam modelos de exibição que retornam uma resposta ao navegador.

Abordaremos todos esses conceitos nesta série de tutoriais e mostraremos como usá-los para criar um aplicativo.

Vamos começar criando uma classe de controlador. Em Gerenciador de Soluções, clique com o botão direito do mouse na pasta Controladores e, em seguida, clique em Adicionar e controlador.

Captura de tela que mostra a janela Gerenciador de Soluções. O menu Controladores clica com o botão direito do mouse e o sub menu Adicionar estão abertos.

Na caixa de diálogo Adicionar Scaffold , clique em Controlador MVC 5 – Vazio e clique em Adicionar.

Captura de tela que mostra a caixa de diálogo Adicionar Scaffold. Controlador M V C 5 Vazio está selecionado.

Nomeie seu novo controlador como "HelloWorldController" e clique em Adicionar.

adicionar controlador

Observe em Gerenciador de Soluções que um novo arquivo foi criado chamado HelloWorldController.cs e uma nova pasta Views\HelloWorld. O controlador está aberto no IDE.

Captura de tela que mostra a guia dot c s do controlador de Olá, Mundo aberta. No Gerenciador de Soluções, a subpasta do ponto c do Olá, Mundo Controller e a subpasta Olá, Mundo são circuladas em vermelho.

Substitua o conteúdo do arquivo pelo código a seguir.

using System.Web;
using System.Web.Mvc; 
 
namespace MvcMovie.Controllers 
{ 
    public class HelloWorldController : Controller 
    { 
        // 
        // GET: /HelloWorld/ 
 
        public string Index() 
        { 
            return "This is my <b>default</b> action..."; 
        } 
 
        // 
        // GET: /HelloWorld/Welcome/ 
 
        public string Welcome() 
        { 
            return "This is the Welcome action method..."; 
        } 
    } 
}

Os métodos do controlador retornarão uma cadeia de caracteres de HTML como exemplo. O controlador é nomeado HelloWorldController e o primeiro método é chamado Index. Vamos invocá-lo de um navegador. Execute o aplicativo (pressione F5 ou Ctrl+F5). No navegador, acrescente "HelloWorld" ao caminho na barra de endereços. (Por exemplo, na ilustração abaixo, é http://localhost:1234/HelloWorld.) A página no navegador será semelhante à captura de tela a seguir. No método acima, o código retornou uma cadeia de caracteres diretamente. Você disse ao sistema para retornar apenas alguns HTML, e ele fez!

Captura de tela que mostra a guia host local com o texto Esta é a minha ação padrão na janela.

ASP.NET MVC invoca classes de controlador diferentes (e diferentes métodos de ação dentro delas), dependendo da URL de entrada. A lógica de roteamento de URL padrão usada pelo ASP.NET MVC usa um formato como este para determinar qual código invocar:

/[Controller]/[ActionName]/[Parameters]

Você define o formato para roteamento no arquivo App_Start/RouteConfig.cs .

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

Quando você executa o aplicativo e não fornece nenhum segmento de URL, ele usa como padrão o controlador "Home" e o método de ação "Index" especificado na seção padrões do código acima.

A primeira parte da URL determina a classe de controlador a ser executada. Assim /HelloWorld mapeia para a HelloWorldController classe . A segunda parte da URL determina o método de ação na classe a ser executada. Assim , /HelloWorld/Index faria com que o Index método da HelloWorldController classe fosse executado. Observe que só precisamos navegar até /HelloWorld e o Index método foi usado por padrão. Isso ocorre porque um método chamado Index é o método padrão que será chamado em um controlador se um não for especificado explicitamente. A terceira parte do segmento de URL (Parameters) refere-se aos dados de rota. Veremos os dados de rota mais adiante neste tutorial.

Navegue até http://localhost:xxxx/HelloWorld/Welcome. O método Welcome é executado e retorna a cadeia de caracteres “Este é o método de ação Boas-vindas...”. O mapeamento de MVC padrão é /[Controller]/[ActionName]/[Parameters]. Para essa URL, o controlador é HelloWorld e Welcome é o método de ação. Você ainda não usou a parte [Parameters] da URL.

Captura de tela que mostra a guia host local com o texto Este é o método de ação De boas-vindas na janela.

Vamos modificar um pouco o exemplo para que você possa passar algumas informações de parâmetro da URL para o controlador (por exemplo, /HelloWorld/Welcome?name=Scott&numtimes=4). Altere seu Welcome método para incluir dois parâmetros, conforme mostrado abaixo. Observe que o código usa o recurso de parâmetro opcional C# para indicar que o numTimes parâmetro deve ser padronizado como 1 se nenhum valor for passado para esse parâmetro.

public string Welcome(string name, int numTimes = 1) {
     return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes);
}

Observação

Observação de segurança: o código acima usa HttpUtility.HtmlEncode para proteger o aplicativo contra entrada mal-intencionada (ou seja, JavaScript). Para obter mais informações, consulte Como proteger contra explorações de script em um aplicativo Web aplicando codificação HTML a cadeias de caracteres.

Execute seu aplicativo e navegue até a URL de exemplo (http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4). Você pode tentar valores diferentes para name e numtimes na URL. O ASP.NET sistema de associação de modelo MVC mapeia automaticamente os parâmetros nomeados da cadeia de caracteres de consulta na barra de endereços para parâmetros em seu método.

Captura de tela que mostra uma janela do navegador com a barra de dois-pontos do host local da U R L 1 2 3 4 Olá, Mundo barra de avanço Nome do ponto de interrogação de boas-vindas é igual a Scott e num vezes igual a 4. O texto na janela é Hello Scott Num Times é 4.

No exemplo acima, o segmento de URL ( Parameters) não é usado, os name parâmetros e numTimes são passados como cadeias de caracteres de consulta. O ? (ponto de interrogação) na URL acima é um separador e as cadeias de caracteres de consulta seguem. O caractere & separa as cadeias de caracteres de consulta.

Substitua o método Welcome pelo seguinte código:

public string Welcome(string name, int ID = 1)
{
    return HttpUtility.HtmlEncode("Hello " + name + ", ID: " + ID);
}

Execute o aplicativo e insira a seguinte URL: http://localhost:xxx/HelloWorld/Welcome/1?name=Scott

Captura de tela que mostra uma janela do navegador com o ponto de interrogação do host local U R L 1 2 3 4 para frente Olá, Mundo barra de boas-vindas barra de boas-vindas barra 1 nome de ponto de interrogação igual a scott. O texto na janela é Hello Scott ID 1.

Desta vez, o terceiro segmento de URL correspondeu ao parâmetro ID. de rota O Welcome método action contém um parâmetro (ID) que correspondeu à especificação de URL no RegisterRoutes método .

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

Em ASP.NET aplicativos MVC, é mais comum passar parâmetros como dados de rota (como fizemos com a ID acima) do que passá-los como cadeias de caracteres de consulta. Você também pode adicionar uma rota para passar os name parâmetros e numtimes em como dados de rota na URL. No arquivo App_Start\RouteConfig.cs , adicione a rota "Hello":

public class RouteConfig
{
   public static void RegisterRoutes(RouteCollection routes)
   {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

      routes.MapRoute(
          name: "Default",
          url: "{controller}/{action}/{id}",
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );

      routes.MapRoute(
           name: "Hello",
           url: "{controller}/{action}/{name}/{id}"
       );
   }
}

Execute o aplicativo e navegue até /localhost:XXX/HelloWorld/Welcome/Scott/3.

Captura de tela que mostra uma janela do navegador com a barra de dois-pontos do host local da U R L 1 2 3 4 para a frente Olá, Mundo barra de boas-vindas barra de boas-vindas scott barra para a frente 3. O texto na janela é Hello Scott ID 3.

Para muitos aplicativos MVC, a rota padrão funciona bem. Você aprenderá mais adiante neste tutorial a passar dados usando o associador de modelo e não precisará modificar a rota padrão para isso.

Nesses exemplos, o controlador vem fazendo a parte "VC" do MVC , ou seja, o modo de exibição e o controlador funcionam. O controlador retorna o HTML diretamente. Normalmente, você não deseja que os controladores retornem HTML diretamente, pois isso se torna muito complicado para o código. Em vez disso, normalmente usaremos um arquivo de modelo de exibição separado para ajudar a gerar a resposta HTML. Vamos ver a seguir como podemos fazer isso.