S2B ASP.NET MVC 1 Laboratório 3 Controllers Neste laboratório é apresentado o uso de controladores, ações e objetos de resultado. 1. Uso dos objetos Request e Response 1.1 No Visual Studio, abra a sua solução do laboratório 02 ou descompacte e abra a solução disponibilizada na página de materiais do curso 1.2 Abra o controlador HomeController e adicione o seguinte método de ação: public void Agente() string agent = Request.Browser.Browser; string useragent = Request.UserAgent; string source = Request.UserHostAddress; Response.Write("<H1>Hello MVC!</H1>"); Response.Write("<h2>Welcome, you are using "); Response.Write(agent); Response.Write(" and your address is "); Response.Write(source); Response.Write("! </h2>"); Response.Write("<h2>User agent: "); Response.Write(useragent+"</h2>"); 1.3 Execute a aplicação e teste o método Agente (http://localhost:<porta>/home/agente). 2 Uso de parâmetros 2.1 Adicione ao HomeController dois novos métodos de ação: public void HelloName(string name) string value = HttpUtility.HtmlEncode(name); Response.Write("<H1>Hello "); Response.Write(value); Response.Write("!</H1>"); public void HelloId(string id) string value = HttpUtility.HtmlEncode(id); Response.Write("<H1>Hello "); Response.Write(value); Response.Write("!</H1>"); 2.2 Execute a aplicação e note o comportamento dos casos abaixo. Note que as regras de roteamento podem ser utilizadas para obter valores de uma URL. http://localhost:<porta>/home/helloname?name=alan+turing http://localhost:<porta>/home/helloname?name=alan%20turing http://localhost:<porta>/home/helloname?name=alan Turing
S2B ASP.NET MVC 2 http://localhost:<porta>/home/helloname/alan Turing http://localhost:<porta>/home/helloname?name=<alan Turing> http://localhost:<porta>/home/helloid/alan%20turing http://localhost:<porta>/home/helloid/alan Turing http://localhost:<porta>/home/helloid?id=alan Turing / id http://localhost:<porta>/home/helloid/<alan Turing> 3 Tipos de retorno de um método de ação 3.1 Baixe e descompacte o arquivo Lab03_Catalogo.zip disponível em labs recursos e arraste a pasta Catalogo para a pasta Content do projeto. 3.2 Adicione ao controlador MovieController os métodos de ação abaixo: public ActionResult Catalogo(string titulo) string filepath = Server.MapPath("~/Content/Catalogo/") + titulo.tolower()+".pdf"; if ( System.IO.File.Exists(filePath) ) return new FilePathResult(filePath, "application/pdf"); else return HttpNotFound(); public JsonResult Filmes() // atenção: este código é apenas um exemplo; // ver possíveis vulnerabilidades em: // http://msdn.microsoft.com/query/dev11.query?appid=dev11idef1&l=en- US&k=k(System.Web.Mvc.JsonRequestBehavior);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)&rd=true // http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-jsonvulnerability.aspx // http://msdn.microsoft.com/en-us/library/hh404095.aspx var model = from movie in db.movies select new Titulo = movie.title, Diretor = movie.director, Ano = movie.releasedate.year, Genero = movie.genre.name ; return Json(model.OrderBy( m => m.ano), JsonRequestBehavior.AllowGet); 3.3 Compile e teste utilizando as URLs abaixo: http://localhost:<porta>/movie/catalogo?titulo=pulpfiction (ou backtothefuture, ou thematriz) http://localhost:<porta>/movie/filmes 4 Operações de CLUDD
S2B ASP.NET MVC 3 4.1 Nesta seção será criado um controlador CLUDD (Create, List, Update, Delete, Details ) e suas views associadas (que foram criados automaticamente pelo processo de scaffolding no laboratório anterior. 4.2 Adicione ao projeto um novo controlador de nome FilmeController. Para este controlador, utilize o template MVC controller with read/write actions, verifique o código gerado e veja que já estão ali as operações básicas de CRUD. 4.3 Adicione ao controlador um atributo para acesso ao repositório (será necessário fazer referência ao namespace): private MovieDBContext moviedb = new MovieDBContext(); 4.4 Altere o método index para apresentar a lista dos 10 filmes do catálogo melhor avaliados (mais tarde incluiremos um mecanismo para paginar a apresentação dos filmes): public ActionResult Index() var filmes = this.moviedb.movies.include("genre").orderbydescending(a => a.gross).take(10).tolist(); return View(filmes); 4.5 Crie uma view para este método utilizando o MVC Scaffolding. Posicione o mouse sobre o código do método e com o botão direito do mouse selecione Add View Selecione o template List e como Model Class o model Movie, conforme abaixo: 4.6 Execute a aplicação e teste. 4.7 Para criar ou editar um filme, necessitamos processor em dois passos : o momento que o usuário solicita a operação (HttpGet) e o momento em que ele confirma a operação (HttpPost).
S2B ASP.NET MVC 4 Para editar um filme, altere os métodos de ação Edit para (será necessário adicionar o namespace using System.Data): // GET: Filme/Edit/5 public ActionResult Edit(int id) Movie filme = this.moviedb.movies.find(id); if (filme == null) return this.httpnotfound(); this.viewbag.genreid = new SelectList(this.movieDb.Genres, "GenreId", "Name", filme.genreid); return this.view(filme); [HttpPost] public ActionResult Edit(Movie album) if (ModelState.IsValid) this.moviedb.entry(album).state = EntityState.Modified; this.moviedb.savechanges(); return this.redirecttoaction("index"); this.viewbag.genreid = new SelectList(this.movieDb.Genres, "GenreId", "Name", album.genreid); return this.view(album); 4.8 Adicione uma view para a edição utilizando o MVC Scaffold e o template Edit. 4.9 Execute e teste, verifique a aplicação das regras de validação e apresentação. 4.10 Para manipular a remoção de um álbum, altere os seguintes métodos de ação no controlador (verifique e acrescente os namespaces necessários): // // GET: /Store/Delete/5 public ActionResult Delete(int id) Album album = this.storedb.albums.find(id); if (album == null) return this.httpnotfound();
S2B ASP.NET MVC 5 return this.view(album); // // POST: /Store/Delete/5 [HttpPost] public ActionResult Delete(int id, FormCollection collection) Album album = this.storedb.albums.find(id); this.storedb.albums.remove(album); this.storedb.savechanges(); return this.redirecttoaction("index"); 4.11 Crie uma view para a remoção, desta vez utilize o template Delete. 4.12 Execute e teste. 4.13 Para finalizar, vamos adicionar um pequeno mecanismo de pesquisa à aplicação. Vamos alterar o método de ação Index para filtrar os filmes a partir de uma substring fornecida pelo usuário. Use o seguinte método: public ViewResult Index(string searchstring) var movies = from movie in moviedb.movies select movie; if (!String.IsNullOrEmpty(searchString)) movies = movies.where(s => s.title.contains(searchstring)); return View(movies.ToList()); 4.14 Será necessário acrescentar à view uma caixa de diálogo para informar o texto de pesquisa. Abra a view associada ao método Index (posicione o cursor dentro do método, use o botão direito do mouse e selecione Go To View. Acrescente o código abaixo imediatamente antes da tag <table class="table">: @using (Html.BeginForm()) <p> Find by name: @Html.TextBox("SearchString") <input type="submit" value="search" /> </p> 4.15 Execute e teste. 4.16 Altere o método de pesquisa para incluir a propriedade diretor, utilizando a mesma string de pesquisa.