none
Problemas con Url Amigables y JavaScript RRS feed

  • Pregunta

  • Saludos expertos de la programacion.

    bueno trabajo con VS 2010 y Mi problema es que luego de implementar un codigo muy pequeño y sencillo para volver mis url aspx. en url amigables, que vi en este tutorial:

    http://www.jasoft.org/blog/post/PermaLinkaspxguid=66f7629c-e9ad-424e-a2e5-d19e668.aspx

    aparentemente carga todo perfecto excepto los archivos javascript lo que hice fue renombrar los archivos.aspx tal cual esta en el ejemplo del link de la siguiente forma:

     RouteTable.Routes.MapPageRoute(
                   "Ingreso", 
                   "Ingreso",
                   "~/views/login.aspx"        
                 );

    Esto en el archivo global.asax, luego al entrar al navegador y escribir "proyecto/Ingreso"

    pues todo carga bien excepto los archivos javascript...y al inpeccionar el documento con firebug dentro de la etiqueta <head> ahi en la etiqueta <script type="text/javascript" src="js/jquery.min.js">

    aparece lo siguiente :
    pero al escribir esto en el url : "proyecto/views/login.aspx" Todo funciona a la perfeccion.

    a que se debe esto? y como lo arreglo...muchas gracias de antemano




    sábado, 15 de septiembre de 2012 15:57

Respuestas

  • copiando este mismo segmento de codigo directamente en el <head> del .aspx funciona correctamente, pero al insertarlo dentro el archivo .js salta el error

    Lógico. Ya te he dicho que el .js no atraviesa el motor ASPX y por lo tanto no se interpreta la instrucción contenida entre <% y %>. La primera línea (la que contiene esa operación) tiene que ir en el .aspx, mientras que todo el resto (el $.ajax) es lo que qedaría dentro del .js.

    • Marcado como respuesta ivankikes miércoles, 19 de septiembre de 2012 18:31
    miércoles, 19 de septiembre de 2012 16:52

Todas las respuestas

  • a que se debe esto? y como lo arreglo

    Se debe a que has incluido el script con una ruta relativa en lugar de una ruta absoluta. Es decir, has puesto en el tag de script el parámetro src="js/jquery.min.js", que significa "toma la tuta actual de la página y detrás concaténale "js/jquery.min.js". Cuando la ruta de la página es proyecto/views, y detrás le concatenas ese fragmento, sale correctamente la ubicación del .js. Pero cuando la página es "proyecto/Ingreso", intenta encontrar el js en proyecto/js/jquery.min.js, y ahi no lo encuentra y sale el error 404.

    ¿Cómo se arregla? De dos maneras: Una es añadir al mapa de rutas otra ruta que permita alcanzar el .js. La otra es poner una ruta absoluta en la dirección del archivo, es decir, una que empiece por "/", es decir, algo así como src="/MiProyecto/views/js/jquery.min.js". Esto tiene una pega, y es que la primera parte (MiProyecto en el ejemplo) variará según dónde hayas instalado la aplicación y cómo esté configurado el servidor. Puedes soslayar este inconveniente incrustando en el fuente una instrucción ResolveUrl para que se construya la ruta correcta dinámicamente. Algo similar a lo siguiente:

    <script src="<%=ResolveUrl("~/views/js/jquery.min.js")%>" type="text/javascript"></script>

    domingo, 16 de septiembre de 2012 7:08
  • Saludos Alberto y gracias por responder, te comento que te intente con:

    <script src="<%=ResolveUrl("~/views/js/jquery.min.js")%>" type="text/javascript"></script>

    y pues funciona de forma algo defectuosa, los sliders y los carruseles que tengo con jquery estan funcionando de forma erronea, y supongo que es por las imagenes verdad?, debo darles direcciones absolutas a las imagenes que llamo dentro de login.aspx

    ahora surge otra duda: ¿Como manejo el tema de $.ajax, con el metodo GET o POST? ¿como cambio la ruta del WebMethod que en este caso se encuentra en el archivo login.aspx.cs? como debo poner la ruta hacia este webmethod? mi llamada es la siguiente:

    Muchas Gracias Nuevamente Alberto.


    • Editado ivankikes domingo, 16 de septiembre de 2012 22:35
    domingo, 16 de septiembre de 2012 22:30
  • Efectivamente, todo lo que se ejecute en el lado cliente y tenga rutas relativas a la página (por ejemplo imágenes o urls de retrollamada) fallará si cambias la ruta de la página. Y el remedio, una vez más, consiste en usar rutas absolutas.

    En el caso de las imágenes, si las presentas mediante un <asp:Image> puedes poner una url que empiece por "~/", y ASP.NET ya sabe interpretar esa tilde en el sentido de que debe introducirse ahi la ruta absoluta de la raíz de la web. Si en lugar de un control asp.net usas un tag de html tal como <img>, el truco de la tilde no funciona y necesitarás meter un <%= ResolveUrl(...) %> dentro del src.

    Y en el caso de la url del $.ajax, pasa lo mismo: Si está escrito directamente en el fuente de la página, puedes meterle <%= ResolveUrl(...) %>. Si está dentro de un string en el code-behind y lo estás enviando a la página con RegisterClientScriptBlock, entonces puedes concatenar directamente en el string el resultado de llamar al método ResolveUrl.

    lunes, 17 de septiembre de 2012 6:07
  • Nuevamente muchas gracias Alberto, lo ultimo ajax aun no me funciona, intente con lo siguiente

    '<%= ResolveUrl("~/views/Login.aspx/Autentificacion")%>';

    y tambien

    '<%= ResolveClientUrl("~/views/Login.aspx/Autentificacion")%>';

    pero me da un error de. Error HTTP 400 - Bad Request.

    Nota: tengo todo en un archivo .js y no asi en el mismo .aspx

    Gracias.

    este es mi codigo

    y este el error:

    el error simplemente no dice nada, pero intente de muchas formas la resolucion del url, pero no se en que fallo, espero puedas orientarme con este problema, Gracias

    • Editado ivankikes lunes, 17 de septiembre de 2012 14:30
    lunes, 17 de septiembre de 2012 13:50
  • Nota: tengo todo en un archivo .js y no asi en el mismo .aspx

    Ah, no, así no funciona. El archivo .js se sirve directamente a la página cliente y no atraviesa el motor aspx, así que los "ResolveUrl" que haya dentro no se procesan. No se me ocurre ninguna solución sencilla, aparte de la de modificar manualmente el .js para meter una url absoluta en lugar de relativa. Creo que también funcionaría si la url fuese relativa a la del propio .js (en lugar de relativa a la página que lo contiene), pero no estoy seguro, tendrás que probarlo. Si eso no funciona, otra opción es inicializar una variable de javascript dentro de la página .aspx antes del "include" del .js, metiéndole la url con el ResolveUrl. Después dentro del .js usar esa variable como valor de la url.

    lunes, 17 de septiembre de 2012 19:07
  • Hola, 

    cómo estás casteando los parámetros? se me hace raro esta parte:

    data = JSON.stringify({ ci: ci})

    porque tu error da que nunca llega al data.d

    aparte que no estás asignando nada supongo, como es tu método? qué retorna?

    saludos

    lunes, 17 de septiembre de 2012 19:24
  • Saludos Alberto, copiando este mismo segmento de codigo directamente en el <head> del .aspx funciona correctamente, pero al insertarlo dentro el archivo .js salta el error.


    miércoles, 19 de septiembre de 2012 14:43
  • Saludos jose, y muchas gracias por responder

    sobre tu pregunta, en realidad no casteo nada, porque manejo todo como string...ahora el error no es del resultado, creo que mas es de mal requerimien, "bad request"....ahora todo se arregla si copio ese $.ajax en mi .aspx en vez de tenerlo en el .js

    Como dice alberto los resolveUrl no se procesan dentro del archivo js.

    miércoles, 19 de septiembre de 2012 15:00
  • Hola,

    Entonces debías quitar el resolveUrl. El error si es en el resultado, porque te manda de frente al error, dime una cosa, como estás especificando tu método Autentificacion? lleva parámetros?

    Porque si no, debería ir así:

    data: {}

    saludos

    miércoles, 19 de septiembre de 2012 15:09
  • copiando este mismo segmento de codigo directamente en el <head> del .aspx funciona correctamente, pero al insertarlo dentro el archivo .js salta el error

    Lógico. Ya te he dicho que el .js no atraviesa el motor ASPX y por lo tanto no se interpreta la instrucción contenida entre <% y %>. La primera línea (la que contiene esa operación) tiene que ir en el .aspx, mientras que todo el resto (el $.ajax) es lo que qedaría dentro del .js.

    • Marcado como respuesta ivankikes miércoles, 19 de septiembre de 2012 18:31
    miércoles, 19 de septiembre de 2012 16:52
  • Josue, te comento que el error no es en el resultado, puesto que poniendo un punto de interrupcion en el webmethod, pues jamas ingresa siquiera al metodo, y si porupuesto que envio parametros, el ci, que es un ide de area por asi decirlo y lo primero que hace el webmethod es identificar el area, en realidad funciona todo correcto. Es en el intento de integrar URL's amigables donde me surgen todos estos errores...creo que la solucion esta como dice Alberto en enviar el resolveUrl desde el aspx y todo lo el resto del $.ajax se mantenga en el archivo.js

    De todos modos muchas gracias por la ayuda Josue.

    miércoles, 19 de septiembre de 2012 18:31