none
Error en Jquery Ajax RRS feed

  • Pregunta

  • Buenas,

    Estoy desarrollando una web con MVC 3, y estaba añadiendo un poco de Ajax, este el metodo que cree:

     <script type="text/javascript">
            $('#Clientes').change(function () {
                var valorMenu = $("#Clientes :selected").text();
                var Id = $("#Clientes").val();
                alert(Id);
                $.ajax({
                    type: "POST",
                    url: "Reports/GetMenu",
                    data: { id: Id },
                    success: function (response) {
                        alert(Id);
                        $(".dynamic").remove();
                        $("#menu").prepend(response.menu);
                        $("#TituloPrincipal").text("Administracion de " + valorMenu + "");
                    },
                    error: function (response) {
                        alert("error");
                                        }
    
                });
            });                    
     </script>

    Este metodo esta en el layout, y accediendo desde /home/Index funciona bien, pero accediendo desde /reports/Index no funciona. Intente cambiar la situacion del metood a /home/Index y seguia sin funcionar. El evento change funciona correctamente en todos los casos, pero desde /reports/Index me salta el alert de error.

    Vista y controllers son exactamente el mismo....

    Alguna idea?

    jueves, 26 de julio de 2012 10:08

Respuestas

  • Buenas!

    Aunque ya te funciona voy a poner cucharada, para decir una sola cosa: nunca, nunca, nunca uses URLs hardcodeadas en ASP.NET MVC.

    Que te funciona la solución de poner la barra (/) delante es debido a dos razones:

    1. En la tabla de rutas hay una ruta que mapea esta URL en concreto (supongo que estás usando la tabla de rutas por defecto)
    2. Tienes desplegado esta aplicación en la raíz del servidor web.

    Aunque ambas razones pueden estar bajo tu control, no puedes asegurar que no cambiarán (la tabla de rutas se supone que no, ya que la haces tu para tu aplicación) pero el punto 2... Si en producción esta aplicación la despliegas bajo un directorio tipo http://servidor/aplicaciones/ ya tienes el problema. En producción la URL es http://servidor/aplicaciones/reports/getmenu y en desarrollo es http://localhost/reports/getmenu. Si usas /reports/getmenu como URL te funcionará en desarrollo pero en producción no (intentaráir a http://servidor/reports/getmenu que es una URL inválida en producción).

    La solución es usar Url.Action. Conceptualmente en MVC no queremos invocar una URL. Eso es "pensar mucho en páginas". En MVC invocamos acciones de un controlador. Ok, a través de una URL cierto, pero es la tabla de rutas quien "asigna" una URL a una acción de un controlador.

    Así tu código debería ser así (pongo solo una parte):

     $.ajax({
        type: "POST",
        url: "@Url.Action("GetMenu","Reports")",
        data: { id: Id },

    Estoy suponiendo que usas Razor. Si usases el motor de aspx deberías usar <%= Url.Action("GetMenu","Reports") %>. Y estoy suponiendo que la acción se llama GetMenu y el controlador Reports.

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    jueves, 26 de julio de 2012 18:59
  • Hola Gabriel.

    En la propiedad url prueba a poner "/Reports/GetMenu", es decir con la barra delante.


    "En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"

    jueves, 26 de julio de 2012 11:00

Todas las respuestas

  • Hola Gabriel.

    En la propiedad url prueba a poner "/Reports/GetMenu", es decir con la barra delante.


    "En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"

    jueves, 26 de julio de 2012 11:00
  • Si!! era eso..... gracias tio!
    jueves, 26 de julio de 2012 12:19
  • De nada, para eso estamos ;o)

    "En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"

    jueves, 26 de julio de 2012 12:27
  • Buenas!

    Aunque ya te funciona voy a poner cucharada, para decir una sola cosa: nunca, nunca, nunca uses URLs hardcodeadas en ASP.NET MVC.

    Que te funciona la solución de poner la barra (/) delante es debido a dos razones:

    1. En la tabla de rutas hay una ruta que mapea esta URL en concreto (supongo que estás usando la tabla de rutas por defecto)
    2. Tienes desplegado esta aplicación en la raíz del servidor web.

    Aunque ambas razones pueden estar bajo tu control, no puedes asegurar que no cambiarán (la tabla de rutas se supone que no, ya que la haces tu para tu aplicación) pero el punto 2... Si en producción esta aplicación la despliegas bajo un directorio tipo http://servidor/aplicaciones/ ya tienes el problema. En producción la URL es http://servidor/aplicaciones/reports/getmenu y en desarrollo es http://localhost/reports/getmenu. Si usas /reports/getmenu como URL te funcionará en desarrollo pero en producción no (intentaráir a http://servidor/reports/getmenu que es una URL inválida en producción).

    La solución es usar Url.Action. Conceptualmente en MVC no queremos invocar una URL. Eso es "pensar mucho en páginas". En MVC invocamos acciones de un controlador. Ok, a través de una URL cierto, pero es la tabla de rutas quien "asigna" una URL a una acción de un controlador.

    Así tu código debería ser así (pongo solo una parte):

     $.ajax({
        type: "POST",
        url: "@Url.Action("GetMenu","Reports")",
        data: { id: Id },

    Estoy suponiendo que usas Razor. Si usases el motor de aspx deberías usar <%= Url.Action("GetMenu","Reports") %>. Y estoy suponiendo que la acción se llama GetMenu y el controlador Reports.

    Un saludo!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    jueves, 26 de julio de 2012 18:59
  • Siempre habia visto en los ejemplos de Ajax con Jquery esa manera de hacerlo, por lo que suponia hasta este momento que debia ser lo correcto, gracias a tu post he visto como mejorar mi codigo. Gracias

    viernes, 27 de julio de 2012 7:38