Usuário com melhor resposta
Submit - MVC

Pergunta
-
Pessoal, sou iniciante em ASP.NET e OO, estou com uma dúvida básica usando MVC:
Tenho um index.aspx abaixo:<%
@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<
asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
Home Page
<
script language="javascript" type="text/javascript">
</
script>
</
asp:Content>
<
asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<p> Identificao:
<input id="Text1" style="width: 216px" type="text" /><p>
<input id="Submit1" type="submit" value="submit" /></p>
</
asp:Content>
Como eu faço para que quando o usuário preencher o campo texto e clicar no submit, o programa abra uma outra view que mostre o conteúdo do texto digitado?
Tem que definir um ActionResult Submit() no controller? Ou é de outra forma?
Obrigado.- Movido C. Augusto Proiete [MVP]Moderator quinta-feira, 1 de outubro de 2009 23:12 Movendo para fórum apropriado (De:ASP .NET)
Respostas
-
Augusto,
Você pode fazer da seguinte forma.
Primeiro o código que você postou deve ficar da seguinte forma:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server"> Home Page </asp:Content> <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> <% using(Html.BeginForm("Teste")){ %> <p> <label for="Text1">Identificao:</label> <input id="Text1" name="Text1" style="width: 216px" type="text" /> </p> <p> <input id="Submit1" type="submit" value="submit" /> </p> <%}%> </asp:Content>
No seu HomeController você deverá criar o seguinte Action:
public ActionResult Teste(string Text1) { ViewData["Text1"] = Text1; return View(); }
E você deverá criar uma view chamada Teste dentro da pasta View\Home com o seguinte código:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server"> Home Page </asp:Content> <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> <p><%= Html.Encode(ViewData["Text1"])%></p> </asp:Content>
Ok.
E para aprender mais sobre MVC você pode ver vários exemplos no site http://asp.net/mvc.
E aproveitando esta resposta quero divulgar o fórum do ASP .NET MVC (http://social.msdn.microsoft.com/Forums/pt-BR/mvcpt/).
Lá você pode postar suas dúvidas sobre o ASP .NET MVC que tem uma turma bem disposta para ajudá-lo.
Veja o link abaixo ele tem ótimos videos que mostram algumas boas práticas em um projeto MVC (tem de saber English).
http://sitewaredevelopers.blogspot.com/2009/09/m-is-for-model.html
Espero ter ajudado. Qualquer dúvida entre em contato.
Att,
Douglas Aguiar
MCAD, MCT- Sugerido como Resposta Douglas Aguiar quinta-feira, 1 de outubro de 2009 14:21
- Marcado como Resposta augusto.ford quinta-feira, 1 de outubro de 2009 16:34
-
Augusto,
Isto mesmo.
Ao colocar o using(Html.BeginForm("Teste")) ele cria um <form action="Home/Teste"> ... </form> e ao ocorrer o submit o Router do ASP procura por um método com o nome de Teste dentro da controller Home e todos os valores dos inputs que existirem dentro daquele form vão via http post para o controller.
Mas porém o problema que está ocorrendo é porque o código que te passei esta com erro (foi mal, fiz no bloco de notas) troque o using(Html.BeginForm("Teste")) por using(Html.BeginForm("Teste", "Home")), é necessário informar o nome do controller.
Espero ter ajudado. Qualquer dúvida entre em contato.Att,
Douglas Aguiar
MCAD, MCT- Sugerido como Resposta Douglas Aguiar quinta-feira, 1 de outubro de 2009 17:46
- Marcado como Resposta augusto.ford quinta-feira, 1 de outubro de 2009 18:26
-
Augusto,
É sim uma outra forma de se fazer.
Ai você filtrou o Request pelo method, isso é uma coisa muito legal do MVC.
Agora só uma coisa ai que não ficou legal é o Session, o melhor seria você utilizar o ViewData ou o Model que é a forma correta de passar dados para a View e ao invés de usar o RedirectToAction você poderia fazer desta forma:
[AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(string Text1) { ViewData["Text1"] = Text1; return View("Teste"); }
E daí você poderia excluir o Action Teste.
O RedirectToAction gera um trafego a mais desnecessário.
Os método da controller nem sempre precisam estar amarrados a uma View isto é uma outra coisa muito legal e poderosa do MVC.
Espero ter ajudado. Qualquer dúvida entre em contato.Att,
Douglas Aguiar
MCAD, MCT- Sugerido como Resposta Douglas Aguiar quinta-feira, 1 de outubro de 2009 18:53
- Marcado como Resposta augusto.ford quinta-feira, 1 de outubro de 2009 19:11
Todas as Respostas
-
Augusto,
Você pode fazer da seguinte forma.
Primeiro o código que você postou deve ficar da seguinte forma:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server"> Home Page </asp:Content> <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> <% using(Html.BeginForm("Teste")){ %> <p> <label for="Text1">Identificao:</label> <input id="Text1" name="Text1" style="width: 216px" type="text" /> </p> <p> <input id="Submit1" type="submit" value="submit" /> </p> <%}%> </asp:Content>
No seu HomeController você deverá criar o seguinte Action:
public ActionResult Teste(string Text1) { ViewData["Text1"] = Text1; return View(); }
E você deverá criar uma view chamada Teste dentro da pasta View\Home com o seguinte código:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server"> Home Page </asp:Content> <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> <p><%= Html.Encode(ViewData["Text1"])%></p> </asp:Content>
Ok.
E para aprender mais sobre MVC você pode ver vários exemplos no site http://asp.net/mvc.
E aproveitando esta resposta quero divulgar o fórum do ASP .NET MVC (http://social.msdn.microsoft.com/Forums/pt-BR/mvcpt/).
Lá você pode postar suas dúvidas sobre o ASP .NET MVC que tem uma turma bem disposta para ajudá-lo.
Veja o link abaixo ele tem ótimos videos que mostram algumas boas práticas em um projeto MVC (tem de saber English).
http://sitewaredevelopers.blogspot.com/2009/09/m-is-for-model.html
Espero ter ajudado. Qualquer dúvida entre em contato.
Att,
Douglas Aguiar
MCAD, MCT- Sugerido como Resposta Douglas Aguiar quinta-feira, 1 de outubro de 2009 14:21
- Marcado como Resposta augusto.ford quinta-feira, 1 de outubro de 2009 16:34
-
Douglas,
Obrigado pela resposta.
Fiz o que você sugeriu, mas quando eu preencho o campo texto e clico no submit, aparece a mesma tela de novo, sem mostrar o que digitei, com a diferença de que na url aparece http://localhost:2130/?Length=5
O código inicial que lhe passei é do próprio index.asp do Home. Deixei na Homecontroller o código abaixo também:
public ActionResult Index()
{
return View();
}
Quando você coloca na view: <% using(Html.BeginForm("Teste")){ %>
significa que o submit deve chamar o ActionResult Teste? É desta forma que se vincula um submit?
Grato -
Augusto,
Isto mesmo.
Ao colocar o using(Html.BeginForm("Teste")) ele cria um <form action="Home/Teste"> ... </form> e ao ocorrer o submit o Router do ASP procura por um método com o nome de Teste dentro da controller Home e todos os valores dos inputs que existirem dentro daquele form vão via http post para o controller.
Mas porém o problema que está ocorrendo é porque o código que te passei esta com erro (foi mal, fiz no bloco de notas) troque o using(Html.BeginForm("Teste")) por using(Html.BeginForm("Teste", "Home")), é necessário informar o nome do controller.
Espero ter ajudado. Qualquer dúvida entre em contato.Att,
Douglas Aguiar
MCAD, MCT- Sugerido como Resposta Douglas Aguiar quinta-feira, 1 de outubro de 2009 17:46
- Marcado como Resposta augusto.ford quinta-feira, 1 de outubro de 2009 18:26
-
Douglas,
Enquanto aguardava sua resposta, fiz alguns testes e consegui fazer funcionar assim:
No index.asp deixei o <% using(Html.BeginForm()){ %> sem nada dentro do parênteses.
No submit deixei: <input id="Submit1" type="submit" value="submit" method="post" /> acrescentei o method="post".
No controller, dividi o ActionResult Index em Get e Post, e usei variável de sessão.
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index()
{
return View();
}[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(string Text1)
{
Session["identif"] = Text1;
return RedirectToAction("Teste");
}public ActionResult Teste()
{
ViewData["Text1"] = Session["identif"];
return View();
}
Do jeito que fiz seria uma outra forma de fazer? É uma boa forma de se fazer também, ou tem alguma contra-indicação?
Obrigado novamente.
Augusto. -
Augusto,
É sim uma outra forma de se fazer.
Ai você filtrou o Request pelo method, isso é uma coisa muito legal do MVC.
Agora só uma coisa ai que não ficou legal é o Session, o melhor seria você utilizar o ViewData ou o Model que é a forma correta de passar dados para a View e ao invés de usar o RedirectToAction você poderia fazer desta forma:
[AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(string Text1) { ViewData["Text1"] = Text1; return View("Teste"); }
E daí você poderia excluir o Action Teste.
O RedirectToAction gera um trafego a mais desnecessário.
Os método da controller nem sempre precisam estar amarrados a uma View isto é uma outra coisa muito legal e poderosa do MVC.
Espero ter ajudado. Qualquer dúvida entre em contato.Att,
Douglas Aguiar
MCAD, MCT- Sugerido como Resposta Douglas Aguiar quinta-feira, 1 de outubro de 2009 18:53
- Marcado como Resposta augusto.ford quinta-feira, 1 de outubro de 2009 19:11
-
-
De nada Augusto. Precisando só me chamar pelo twitter http://twitter.com/DouglasAguiar.