ViewModel Dynamic em ASP.Net MVC 3

by Felipe Oriani 9. September 2010 05:42

Olá amigos, neste post vou abordar um novo recurso que estará disponível no Asp.Net MVC 3 (atualmente no Preview 1) que é a possibilidade de termos propriedades dinâmicas no ViewData (ViewModel no Asp.Net MVC 3). Antes de abordar o tema principal do post, vamos entender como o ViewData trabalhou trabalha no Asp.Net MVC.

Todo controller em ASP.Net MVC deve herdar diretamente (por default) ou indiretamente de uma classe base chamada “Controller” que está debaixo de System.Web.Mvc para que o framework consiga entender que tal classe é um Controller. Como todos sabem, controllers possuem métodos que podem ser chamados de “Actions” que definem o tipo e qual View será renderizada, e em alguns momentos desejamos passar alguma informação para esta View. Para isso, uma propriedade publica na classe Controller chamada ViewData é responsável por enviar informações para que possam ser acessadas na View.

Esta propriedade ViewData que é do tipo  IDictionary<string, object> (classe concreta ViewDataDictionary) é um objeto do que através de uma chave (string) retorna qualquer objeto (object). Por um lado, isto facilitou muito a vida dos desenvolvedores pois podemos passar qualquer informação para a View sendo que o tipo Object é o tipo básico pra qualquer objeto em .Net. Por outro lado gerou conflitos, pois além de não ser type safe (ou tipado, ter a garantia que aquela instância é de determinado tipo, havendo a necessidade de realizar uma conversão), alguns erros podem passar despercebidos como os índices podem ser “strings mágicas”.

Com isso, foi implementado uma nova propriedade chamada ViewModel na classe controller, que é do tipo dynamic (novo recurso disponível a partir do .Net Framework 4.0) que permite que você defina propriedades em tempo de execução e o compilador as resolve para nós definindo o tipo, ou seja, quando fazíamos:

            ViewData["Mensagem"] = "Olá Mundo ViewData";

 

Agora podemos fazer:

            ViewModel.Mensagem = "Olá Mundo ViewModel";

 

Perceba que ViewModel é outra propriedade, ou seja, ViewData ainda existe porém não contém recursos de type safe, já a ViewModel pelo fato de ser do tipo dynamic, conseguimos definir uma propriedade qualquer e aplicar um valor, como neste exemplo onde definimos uma propriedade chamada “Mensagem” e aplicamos a string  “Olá Mundo ViewModel” fazendo com que dinamicamente o .Net Framework identifique e a crie para nós tal propriedade de tal tipo; Na View conseguimos recuperar ambos os valores tanto como ViewData como ViewModel.

A vantagem disso é que agora temos uma propriedade específica para aplicar ViewModel (boa prática comum até a versão 2.0 do Asp.Net MVC). Podemos utilizar o ViewModel com propriedades dinâmicas a fim de ter maior segurança que tal tipo será retornado durante o processo de execução. Para ilustrar vamos a um exemplo.

Imagine que em nosso projeto temos uma página que irá listar os produtos de um catálogo. Para tanto precisaremos de uma classe produto em nosso Modelo, que defini da seguinte forma:

    public class Produto

    {

        public string Nome { get; set; }

        public decimal Valor { get; set; }

 

        public Produto(string nome, decimal valor)

        {

            this.Nome = nome;

            this.Valor = valor;

        }

    }

 

Em seguida desejamos listar produtos em nossa página, então poderíamos fazer algo do tipo em uma Action:

        public ActionResult Index()

        {

            ViewModel.Titulo = "Produtos do Catálogo";

 

            ViewModel.Produtos = ObterProdutos();

 

            return View();

        }

 

No código acima, definimos uma propriedades chamada Produtos que é inicializada a partir de um método chamado ObterProdutos() que retorna um IEnumerable<Produto>. Em nossa View, conseguimos recuperar a propriedade Produtos e iterá-la pelos objetos:

    <h2><%: View.Titulo %></h2>

   

    <% foreach (var produto in View.Produtos) { %>

     <%: produto.Nome %> - <strong><%: produto.Valor.ToString("C2") %></strong><br />

    <% }%>

 

O resultado:

  

 

Bem, era isso que gostaria de mostrar.

Em minha opinião este recurso irá facilitar muito, pois não vejo mais a necessidade de ficar criando ViewModel para cada View.

Espero que gostem!
Abraços

 

Referências:
http://haacked.com/archive/2010/08/02/dynamic-methods-in-view-data.aspx
http://www.asp.net/mvc

Download do exemplo: Mvc3Dynamic.zip (319,37 kb)

Tags: , , ,

ASP.Net MVC

Upload de Arquivos com Asp.Net MVC

by Felipe Oriani 8. September 2010 04:32

Olá amigos, neste post vou falar um pouco de como trabalhar com arquivos em Asp.Net MVC ou seja, fazer upload. Vou tentar ser direto e prático.

Vamos ao Visual Studio (2008 ou 2010) e crie uma nova aplicação Asp.Net MVC 2 , e vamos ao código de nosso controller Home e crie uma action (métodos) chamada Upload, para receber como no código abaixo:

        public ActionResult Upload()
        {
            return View();
        } 

Se você possui algum conhecimento em Asp.Net MVC, você deve saber que este framework trabalha sobre um sistema de rotas, que toma como base Actions de um Controller. Tendo isso em mente, podemos criar uma view na pasta Views/Home chamada Upload (arquivo Upload.aspx), que será a renderização[3] padrão desta Action. Ao criar esta View, adicione o código abaixo:

    <h2>Upload de Arquivo</h2> 

    <% using (Html.BeginForm("Upload", "Home", FormMethod.Post,

new { enctype = "multipart/form-data" })) { %>

        <input type="file" id="arquivo" name="arquivo" />

        <input type="submit" value="Upload" />

    <% } %>

 

O código acima renderiza um formulário simples para upload de arquivo, dizendo que a tag <form /> será submetida a um action chamada Upload no controller Home pelo método Post junto ao atributo enctype que especifica o tipo de conteúdo que será enviado neste formulário.

Você deve estar se perguntando, como que este formulário irá submeter informações para a mesma action que a renderizou ? De fato, pode parecer mas não é devido a sobrecarga de métodos que podemos fazer .Net. Em nosso controller Home, vamos adicionar outro método que irá receber este arquivo, porém com algumas diferenças, veja no código abaixo:

        [HttpPost]
        public ActionResult Upload(HttpPostedFileBase arquivo)
        {
            if (arquivo != null)
            {

                arquivo.SaveAs(Server.MapPath("~/arquivos/") + Path.GetFileName(arquivo.FileName));
                return RedirectToAction("Index");
            }

            return View();

        }

 

Repare que este método possui uma assinatura diferente do anterior (aplicando a sobrecarga de métodos). O método possui um atributo chamado HttpPost, que implica que aquela Action pode ser invocada a partir do método Post, além de receber também a instância de um objeto HttpPostedFileBase que é o objeto correspondente para nosso arquivo no formulário. 

Com isso testando se algum arquivo foi realmente postado (verificando se o objeto não é nulo) e salvamos este em algum local (estou salvando em uma pasta chamada “arquivos” em projeto, em seguida redirecionamos o usuário para a view Index, do contrário a view de Upload é renderizada novamente. 

Obs: Não estamos fazendo algum tipo de validação mas isso seria possível através de algumas propriedades que o objeto arquivo (de HttpPostedFileBase) disponibiliza. 

Bem, de maneira simples vimos como podemos fazer upload em Asp.Net MVC, e com isso temos várias possibilidades como por exemplo, validar upload de determinados tipos de arquivo, arquivos compactados, imagens a serem trabalhadas, entre outros.

 

Espero que ajude alguém
Abraços

Referências:
http://cavalcante.net/
http://www.asp.net/mvc

 

 

MvcUpload.zip (300,73 kb)

Tags: , ,

ASP.Net MVC | C#

60 bibliotecas que todo desenvolvedor deveria conhecer.

by Felipe Oriani 17. February 2010 07:47

Olá pessoal, navegando pela web encontrei om link interessante e deixarei aqui como referência para quem quer tomar um rumo nos estudos. Trata-se de um post falando de diversas ferramentas que podem nos ajudar no processo de planejamento, desenvolvimento, testes e acompanhamento de um software. Segue o link

http://blog.webdistortion.com/2010/02/16/60-net-libraries-every-developer-should-know-about/

Espero que gostem!
Abraços

Tags: , ,

.Net Framework

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen

Sobre

Sou Felipe Oriani e trabalho com desenvolvimento web desde 2004, com tecnologias Microsoft como Asp e Asp.Net utilizando as linguagens C# e Vb.Net. Bacharel em Ciência da Computação pela Escola de Engenharia de Piracicaba,  MCP (Microsoft Certified Professional) e lider da comunidade C# Brasil. Conheça um pouco mais sobre meu Currículum.

Selos

C# Brasil