none
Submit - MVC RRS feed

  • 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.

    quinta-feira, 1 de outubro de 2009 13:17

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
    quinta-feira, 1 de outubro de 2009 14:20
  • 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
    quinta-feira, 1 de outubro de 2009 17:45
  • 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
    quinta-feira, 1 de outubro de 2009 18:52

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
    quinta-feira, 1 de outubro de 2009 14:20
  • 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 


     

    quinta-feira, 1 de outubro de 2009 16:40
  • 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
    quinta-feira, 1 de outubro de 2009 17:45
  • 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.

    quinta-feira, 1 de outubro de 2009 18:25
  • 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
    quinta-feira, 1 de outubro de 2009 18:52
  • OK, obrigado! Valeu mesmo pela ajuda!
    Augusto.
    quinta-feira, 1 de outubro de 2009 19:25
  • De nada Augusto. Precisando só me chamar pelo twitter http://twitter.com/DouglasAguiar.
    quinta-feira, 1 de outubro de 2009 19:39