Olá pessoal!
Para continuar montando uma estrutura com o MVC 2 utilizando o Visual Studio .NET 2010, tenho o objetivo de mostrar como criar um formulário para envio de e-mail com a nova ferramenta e arquitetura.
É um pouco diferente da forma antiga de fazer, porém, fica bem mais organizado.
Referência:
- Ferramenta: Visual Studio .NET 2010
- Linguagem: C#.NET
- Plataforma: Web
- Arquitetura: MVC
No artigo anterior, foi colocado uma descrição simples na View Contato.aspx criada. Agora vou mostrar uma forma diferente de colocar os campos TextBox com validação de dados.
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"><br /> Contato<br /></asp:Content><br /><br /><asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"><br /><br /> <h2>Contato</h2><br /> <% using (Html.BeginForm())<br /> { %><br /> <%: Html.ValidationSummary(true, "A mensagem falhou a ser enviada! Tente novamente!") %><br /> <fieldset><br /> <legend>Entre em contato</legend><br /><br /> <div><br /> <%: Html.Label("Nome: ") %><br /> </div><br /> <div><br /> <%: Html.TextBox("txtNome", null, new { @class="campo_form" }) %><br /> </div><br /> <div><%: Html.Label("Email: ") %></div><br /> <div><br /> <%: Html.TextBox("txtEmail", null) %><br /> </div><br /> <div><%: Html.Label("Descrição: ") %></div><br /> <div><br /> <%: Html.TextArea("txtDescricao") %><br /> </div><br /> <input type="submit" value="Enviar" /><br /> </fieldset><br /> <% } %><br /></asp:Content>Note que, existe o Content1 e Content2 que a página já cria quando o projeto foi iniciado. Estou usando o HTML.BeginForm() para dar início ao formulário e aquela tag que usamos <form…> para colocar os campos. Veja que os campos são totalmente diferentes, isso porque está sendo usado scrip-led (um nome dado por usar as tags <% dentro da página HTML).
Para label, uso:
<div><br /> <%: Html.Label("Nome: ") %><br /></div>Para textBox:
<div><br /> <%: Html.TextBox("txtEmail", null) %><br /></div>Para textArea uso:
<div><br /> <%: Html.TextArea("txtDescricao") %><br /></div>Para utilizar o formulário com algum estilo específico, basta acrescentar alguns dados no script da tela. Veja:
<div><br /> <%: Html.TextBox("txtNome", null, new { @class="campo_form" }) %><br /></div>Para submeter o formulário, coloquei um input submit igual ao HTML. Mas dentro da tag formulário.
<input type="submit" value="Enviar" />O validationSummary utilizo com apenas uma linha de código na parte da página.
<%: Html.ValidationSummary(true, "A mensagem falhou a ser enviada! Tente novamente!") %>E isso foi apenas a parte da View Contato que precisei colocar. Agora é necessário fazer a Model e a Controller.
Criando Model
Preciso criar uma Model que tem a regra de validação e envio de e-mail com interface e service. O primeiro passo foi criar uma nova classe chamada Contato.cs. Cliquei com o botão direito em cima da pasta Models, escolhi a opção Add e depois New Item.

Coloquei o nome de “Contato.cs” para a Model.
Como tenho campos para serem digitados, preciso gerar get e set, interface e um service. O método ContatoService é o local onde o e-mail será enviado. Vamos para a prática.
public class Contato<br /> {<br /> [Required]<br /> [DataType(DataType.MultilineText)]<br /> public string txtDescricao { get; set; }<br /><br /> [Required]<br /> [DataType(DataType.Text)]<br /> public string txtNome { get; set; }<br /><br /> [Required]<br /> [ValidatePasswordLength]<br /> [DataType(DataType.EmailAddress)]<br /> public string txtEmail { get; set; }<br /> }A primeira linha [Required] mostra que o campo é requerido, ou seja, obrigatório para digitação. A segunda linha é o DataType, o tipo do campo, note que o primeiro e o segundo são diferentes. Um multilineText e o outro Text.
O próximo passo é gerar outra classe que envia o email e depois gerar a interface. Isso tudo dentro do mesmo arquivo Contato.cs. Abaixo public class Contato, depois de fechar a chave gero outro public class.
public class ContatoService<br /> {<br /> public bool enviarEmail(string descricao, string nome, string email)<br /> {<br /> try<br /> {<br /> MailMessage mailMsg = new MailMessage();<br /> mailMsg.To.Add("mauriciojunior@mauriciojunior.org");<br /><br /> MailAddress mailAd = new MailAddress(email);<br /> mailMsg.From = mailAd;<br /> mailMsg.Subject = "envio de email pelo site";<br /> mailMsg.Body = descricao;<br /><br /> SmtpClient smtpClient = new SmtpClient("mail.service.net", 25);<br /> System.Net.NetworkCredential cred = new System.Net.NetworkCredential("usuario", "senha");<br /><br /> smtpClient.Credentials = cred;<br /> smtpClient.Send(mailMsg);<br /> return true;<br /> }<br /><br /> catch (Exception)<br /> {<br /> return (false);<br /> }<br /> }<br /> }Esse public classe é ContatoService, ou seja, um serviço de contato cujo recebe como parâmetro três dados e retorna um tipo bool. Antes de terminar esta classe existe a interface que precisa ser acrescentada dentro do mesmo arquivo.
public interface IContatoService<br /> {<br /> bool enviarEmail(string descricao, string nome, string email);<br /> }A interface dá-se o início por public interface IContatoService. O mesmo nome, mas com o “I” na frente. A interface chama o método de enviar e-mail com os dados e assim termina o método da Model Contato.
Só que ainda não terminei de fazer tudo que precisava para deixar ok a funcionalidade de enviar email. Como a View Contato está dentro da pasta Home, preciso alterar o arquivo HomeController.cs que está dentro da pasta Controllers. Vou criar um ActionResult com o mesmo nome da View passando como parâmetro os dados criados da Model.
A HomeController.cs está selecionada mostrada na acima. Dentro da classe acrescentei um método Contato informando que é um http Post.
[HttpPost]<br /> public ActionResult Contato(Contato model)<br /> {<br /> if (ModelState.IsValid)<br /> {<br /> ContatoService cs = new ContatoService();<br /> if (cs.enviarEmail(model.txtDescricao, model.txtNome, model.txtEmail))<br /> {<br /> return View("ContatoSucesso");<br /> }<br /> else<br /> ModelState.AddModelError("", "Erro ao enviar a mensagem");<br /> }<br /> else<br /> ModelState.AddModelError("", "Erro ao enviar a mensagem");<br /><br /> return View();<br /> }Dessa forma, ficaram dois métodos com o mesmo nome, mas um recebe parâmetro de entrada e o outro não. Na primeira linha coloquei HttpPost para informar que é um método para dar submit. Dentro do método, verifiquei se a ModelState está válida, ou seja, se todos os parâmetros foram preenchidos. Gerei uma instância de ContatoService chamda cs que chama o método enviarEmail passando os parâmetros usando a model. Caso o resultado for ok, a View chama outra View com a mensagem que foi enviada com sucesso.

Dentro da View Home existe outra view que criei, chamada ContatoSucesso.aspx. Para chamar coloquei o código (return View(“ContatoSucesso”);).
Caso o retorno for false, mando uma mensagem para a tela. Bem simples e fácil de entender. É diferente do que fazíamos anteriormente e fica mais organizado. Segue na prática depois de clicar F5.
Ao iniciar a página, cliquei no botão Enviar da Contato.

Veja que os campos ficaram de outra cor e a mensagem foi exibida. Vou preencher os dados e clicar no botão. Depois de preencher e enviar, veja o que mostrou na tela.

A mensagem que escrevi na View de Sucesso apareceu na tela e o e-mail chegou!
Espero que tenham gostado. Se tiverem alguma dúvida, basta deixar um comentário. Obrigado.








