none
Pasar datos de ASP a funcion javascript RRS feed

  • Debate general

  • Que tal, mi duda es como pasar datos desde mi controlador a una funcion javascript, al presionar un boton, sin tener que recargar toda la pagina. Esto es lo que tengo.

    Las funciones que tengo en mi controlador VentaController. La vista generada fue de INDEX,.

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


            [HttpPost]
            public ActionResult Genera()
            {
                List<clsEspacio> espacios = new List<clsEspacio>();
                clsEspacio objEspacio = new clsEspacio();

                objEspacio.IdEspacio = 1;
                objEspacio.tipo = "S";
                espacios.Add(objEspacio);

                objEspacio.IdEspacio = 2;
                objEspacio.tipo = "S";
                espacios.Add(objEspacio);

                espacios.Add(objEspacio);
                return View(espacios);// esta bien asi, o seria mediante JSON?
            }

    Ahora quiero capturar "espacios" desde una  funcion javascript presionando en el boton:

        <form action="???" method="POST">
        <input id="btnAceptar" type="submit" name="aceptar" value="aceptar" />
        </form>

    No se que mandarle a action =( . Se que mi boton tiene que estar dentro de un formulario ya que quiero qe haga el postback

    y est es mi script

        $("#btnAceptar").click(function (evento) {
            $.ajax({
                url: '/Venta/Genera',
                type: 'POST',
                asinc: true,
                success: Respuesta,
                error: a
            });

        });

    "respuesta" es una funcion javascript donde planeo trabajar los datos obtenidos..

    PD: Uso asp.net mvc 2 c#

    Gracias =)

    sábado, 12 de mayo de 2012 3:10

Todas las respuestas

  • Errr... no, no tienes que poner nada en el "action" del form. De hecho, el botón que vas a utilizar de esta manera ni siquiera tiene por qué encontrarse dentro de un form. Cuando usas jquery para conectar el evento click del botón, lo que haces es indicar que quieres procesar sus "clicks" desde código cliente en lugar de hacer un Submit del form (por cierto, acuérdate de desactivar el comportamiento predeterminado del botón, por ejemplo poniendo return false, para que únicamente ejecute tu subrutina y no haga seguidamente un Submit).

    Dentro de la rutina que has conectado al botón, estás usando $.ajax para que se haga una llamada en modo ajax al servidor. AQUÍ es donde dices a qué método de acción estás llamando, y donde indicas la rutina ("Respuesta") que recibirá los resultados de ese método de acción. Concretamente estás llamando al método Genera del controlador Venta. Es lícito, si lo deseas, hacer un return View(espacios) como estás haciendo, en cuyo caso tu método "Respuesta" recibirá como argumento todo el contenido de esa vista. Dependiendo de lo que quieras hacer con ese contenido, a lo mejor te resulta más sencillo devlverlo como JSON para que sea más fácil decodificarlo en el lado cliente. Pero si, por ejemplo, ese contenido lo vas a pintar "tal cual" en un DIV de la pantalla, entonces es más cómodo que te llegue ya formateado mediante una vista. Si es esto lo que vas a hacer, es más simple usar el método .load de jquery en lugar de $.ajax.

    sábado, 12 de mayo de 2012 7:41
  • Primero que nada te agardesco por tu respuesta =)

    en realidad quiero pasar un objeto de una clase, que tiene cuatro atributos int, y uno de otra clase. Y  en "respuesta" quiero trabajar con innrHTML para llenar una tabla. Para empzar no entendi a que te refieres con  rutina(sorry recien estoy entrando al tema) y me mi codigo javascript como seria, tal cual esta ahi cambiando "$.ajax " por $.load?, o seria de otra forma?.

    Por otro lado "(por cierto, acuérdate de desactivar el comportamiento predeterminado del botón, por ejemplo poniendo return false, para que únicamente ejecute tu subrutina y no haga seguidamente un Submit)." me podrias explicar eso nuevamente xD.

    PDT: el boton fue creado por lado del cliente, no por asp.net

    Gracias nuevamente por darme un poco tu tiempo =)

    domingo, 13 de mayo de 2012 0:38
  • PDT: el boton fue creado por lado del cliente, no por asp.net

    Obviamente, por eso te decía que "ni siquiera tiene por qué encontrarse dentro de un form". Si fuera un control de asp.net, entonces sí que sería obligatorio que estuviera dentro de un form. Pero no funcionaría en MVC; en este entorno no se pueden usar los Controles de Servidor de asp.net.

    Por otro lado "(por cierto, acuérdate de desactivar el comportamiento predeterminado del botón, por ejemplo poniendo return false, para que únicamente ejecute tu subrutina y no haga seguidamente un Submit)." me podrias explicar eso nuevamente

    Si el botón está dentro de un Form, cuando lo pulsas se pide de nuevo la página al servidor y se repinta completa, con lo que ya no sirve para hacer lo que pretendías, que es cambiar únicamente parte del contenido, usando código cliente. Por lo tanto, hay que deshabilitar el comportamiento predefinido del botón, que consiste en hacer un submit del form. Para ello, puedes poner un "return false" en la función de javascript conectada al botón, o bien (ya que estás usando jQuery) llamar al método preventDefault:

    function Respuesta(elEvento) {
                //Aquí tu código
                elEvento.preventDefault();
            }

    en realidad quiero pasar un objeto de una clase, que tiene cuatro atributos int, y uno de otra clase. Y en "respuesta" quiero trabajar con innrHTML para llenar una tabla. Para empzar no entendi a que te refieres con rutina
    Para pasar esos datos, puedes construir una clase auxiliar (es suficiente con que sea un tipo anónimo en C#), meter dentro los atributos que deseas, y devolverlo como JSONresult. Lo de la "rutina" simplemente se refería a la función de javascript que se ejecuta cuando recibes los resultados (según el código que has pegado, se llama "Respuesta"). Ahí es donde tienes que escribir un trozo de programa en javascript que recoja los resultados y los "pinte" en el innerHtml.
    y me mi codigo javascript como seria, tal cual esta ahi cambiando "$.ajax " por $.load?, o seria de otra forma?.
    No, lo del ".load" funciona escribiendo $('selector').load('url'); Lo que hace es llamar a esa url (que puede ser un método de acción de ASP.NET MVC), y todo lo que le devuelva el servidor lo "pinta" dentro del objeto devuelto por $('selector'). De esta manera no hace falta que te preocupes de manipular el innerHtml de ese objeto, ya lo hace por tí la librería jQuery. El contenido que pintas dentro lo puede devolver (si quieres) una vista parcial de MVC, por lo que ya te llega "formateado" y no tienes que preocuparte de pasar esos objetos y atributos que decías. Simplemente se los pasas en el Modelo a la Vista, y así todo el trabajo de composición se hace en el servidor, y no tienes que complicarte la vida dibujando los resultados con javascript en el lado cliente. Pero esto es, desde luego, opcional; si te viene mejor escribir una subrutina en javascript para pintar los resultados en el cliente, entonces es perfectamente válido hacer la llamada con $.ajax (o $.post, o $.get) y transmitir los datos codificados en JSON.
    domingo, 13 de mayo de 2012 15:17
  • gracias= )

    jueves, 17 de mayo de 2012 20:11