none
Redirigir el flujo de la aplicación desde Javascript hacia un controller RRS feed

  • Pregunta

  • Tengo una funcion javascript, que captura en el inicio el evento onkeyup, permitiendo leer desde un dispositivo RFID una tarjeta... esa parte funciona bien, sin embargo, necesito que una vez que el valor es leido, redireccionar el flujo de la aplicacion, hacia un controller mvc, mas precisamente hacia un ActionResult, que me permita validar el dato capturado.

    var token = '';
    document.onkeyup = leer_caracter;
    var timer = null;
    var ingreso_teclado = "";
    function leer_caracter(e) {
        if (timer != null) {
            clearTimeout(timer);
            timer = null;
        }
        var code;
        if (!e)
            var e = window.event;
        if (e.which)
            code = e.which;
        else
            if (e.keyCode)
                code = e.keyCode;
        var caracter = '';
        if (code >= 48 && code <= 57)
            caracter = (code - 48).toString();
        else
            if (code >= 96 && code <= 105)
                caracter = (code - 96).toString();
        if (code != 13 && caracter != "") {
            ingreso_teclado += caracter;
            timer = setTimeout(reset_teclado, 50);
        }
        else {
            if (ingreso_teclado != "" && ingreso_teclado.length > 5) {
                alert("leyendo tarjeta : " + ingreso_teclado)
    
                var url = "@Url.Action('EvaluaAutenticacion', 'Home', new { usuario = '_usuario' })";
                url = url.replace("_epc", ingreso_teclado);
               
                location.href = url;
    
                ingreso_teclado = "";
            }
        }
    }
    function reset_teclado() {
        if (timer != null) {
            timer = null;
            ingreso_teclado = "";
        }
    }

    El error que se me presenta, es precisamente en la linea que dice

    var url = "@Url.Action('EvaluaAutenticacion', 'Home', new { usuario = '_usuario' })";
                url = url.replace("_epc", ingreso_teclado);

    al ejecutar el codigo y validar la tarjeta, me sale un error que dice pagina no encontrada

    HTTP Error 404.0 - Not Found Se ha quitado el recurso que está buscando, se le ha cambiado el nombre o no está disponible en estos momentos.

    como debo realizar esta redireccion?

    Saludos

    sábado, 25 de marzo de 2017 14:10

Todas las respuestas

  • En principio la idea que tienes es buena. Lo único que se me ocurre para que te dé un 404 es que tengas algún error en los parámetros que le pasas al Url.Action, o que el Replace que haces debajo "estropee" algo en la URL. Examina cuál es el valor que te ha generado (puedes parar en esa línea con el debugger en Visual Studio y examinar la variable, o verlo en la barra de navegación del Browser después de que intente navegar a la url), y cerciórate de que es una URL correcta y coherente con el controlador y método de acción al que pretendías navegar.
    sábado, 25 de marzo de 2017 16:15
  • Luis Gabriel Fabres,

    La variable url contiene una cadena donde no noto la sub-cadena '_epc', ¿no deberías reemplazar el contenido de la variable ingreso_teclado por el literal '_usuario'?. Lo dicho es para que lo consideres pero no creo sea el causante del error, cerciórate de haber escrito de manera correcta el nombre del controlador y del método de acción, apóyate con herramientas del browser para dar seguimiento a las acciones, sobre todo toma atención en las pestañas 'Console' y 'Network'.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 25 de marzo de 2017 21:40
  • Hola Alberto, gracias por tu ayuda.

    Mira basicamente creo que (corrigeme si me equivoco) la accion "location.href" no me sirve para redireccionar el flujo hacia un actionResult que existe en un controlador, porque segun veo, lo que intenta hacer es redireccionarme a una vista directamente. es asi como esto funciona?. en tal caso, como llego desde el javascript al actionResult del controlador directamente? 

    la url que me esta generando finalmente es la siguiente:


    y esto tampoco me cuadra con lo que se supone deberia ser la ruta no?

    sera que hay algun problema en el uso de las comillas en la construcción?


                var url = "@Url.Action('EvaluaAutenticacionEpc', 'Home', new { epc = '_epc' })";
                url = url.replace("_epc", ingreso_teclado);


    fijate en la ruta que se genera (por eso pienso que no esta funcionando bien)

    lunes, 27 de marzo de 2017 16:28
  • Hola William, si, efectivamente tenia mal puesta la variable, pero aun asi, el problema persiste, y es lo que le comentaba mas arriba a alberto.

    mi idea, es que desde esta funcion escrita en javascript, pueda saltar a un actionReslt en un controlador, para que ahi pueda utilizar la capa de negocios de la app, y validar contra la base la tarjeta ingresada.

    lunes, 27 de marzo de 2017 16:30
  • hola

    No evaluaste usando jquery, puntualmente con $.ajax para invocar el action del controller

    como se explica en el articulo

    ASP.Net MVC: jQuery AJAX and JSON Example

    dee sta forma no seria un redirect, sino que invocas el action y la respuesta la obtienes en el success para luego aplicar lo que necesites

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 27 de marzo de 2017 16:57
  • la accion "location.href" no me sirve para redireccionar el flujo hacia un actionResult que existe en un controlador, porque segun veo, lo que intenta hacer es redireccionarme a una vista directamente. es asi como esto funciona?

    No, no es así. Con ASP.NET MVC nunca se puede redireccionar directamente a una vista. Todas las peticiones que se envían al servidor van a parar siempre a un Método de Acción. Usualmente, lo que hace el método de acción internamente es devolver una vista (llamando a "return View(...)"), por lo que desde fuera parece que la navegación ha ido a parar a una vista. Pero el hecho de que los métodos de acción frecuentemente funcionen así, no quiere decir que sea obligatorio que todos se programen así. Un método de acción podría devolver un JsonResult, y entonces al cliente que envió la petición http le llega JSON. O podría devolver un FileResult, y al cliente le llega un http con los datos del fichero y las cabeceras configuradas para descargarlo. O incluso puedes declarar un método de acción que en lugar de devolver un ActionResult devuelva un String. Y en el String metes tú lo que te dé la gana al hacer el return desde el método. Lo que hayas puesto ahí es lo que le llegará al cliente que hizo la llamada.

    lunes, 27 de marzo de 2017 17:46
  • ok, entonces creo que hay algo en la construccion de la URL, que no esta funcionando como debiera. digo esto, porque si te fijas, la url que se intenta construir, finalmente no es una URL navegable.


    dice localhost:31843/@Url.Action('Evalua..... resto de la URL

    que es el codigo fuente que esta en la llamada

    var url = "@Url.Action('EvaluaAutenticacionEpc', 'Home', new { epc = '_epc' })"; url = url.replace("_epc", ingreso_teclado);

    location.href = url;

    me falta algo, que me transforme este codigo, en una URL navegable?

    lunes, 27 de marzo de 2017 19:14
  • Hola Leandro, gracias por responder.

    Mira, estuve mirando el articulo que indicas para realizar esta tarea con jquery.

    hay algo que no se bien si con jquery puedlo lograr, y es que el disparador de la accion que lee la tarjeta (tarjeta rfid), esta en el evento OnKeyUp de la pagina, en la cual no tengo un button donde ingresar datos, si no que en este caso, con javascript voy procesando este buffer. entonces como con jquery logro capturar el evento onkeyup de la pagina?.

    Saludos

    lunes, 27 de marzo de 2017 19:17

  • var url = "@Url.Action('EvaluaAutenticacionEpc', 'Home', new { epc = '_epc' })"; url = url.replace("_epc", ingreso_teclado);

    location.href = url;

    me falta algo, que me transforme este codigo, en una URL navegable?

    Lo que noto es que no sobrecargas de manera correcta el método @Url.Action(), debes enmarcar los argumentos entre comillas dobles:

    var url = '@Url.Action("EvaluaAutenticacionEpc", "Home", new { epc = "_epc" })';
    url = url.replace('_epc', ingreso_teclado);
    window.location.href = url;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 27 de marzo de 2017 19:32
  • William, tambien pense que podia deberse a las comillas, y de hecho, tengo el codigo de la misma manera que lo indicaste, es mas para asegurarme, copie tu codigo, pero aun no se genera la url correcta.

    lo otro que pienso podria estar provocando que la url no se resuelva, es que me falte algun ensamblado en el proyecto? Aunque el proyecto es MVC, y lo genere con las herramientas de VS2015.

    lunes, 27 de marzo de 2017 20:06
  • hola

    >>entonces como con jquery logro capturar el evento onkeyup de la pagina?.

    jquery dispone de evento

    https://api.jquery.com/keyup/

    que puedes asociar a los controles

    igual a donde apuntaba no era a usar jquery con el html, sino mas bien para invocar por ajax el action en el controles sin que se actualice o redirecciones a otra pagina

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 27 de marzo de 2017 20:23
  • Finalmente ya pude resolver el problema, que se trataba mas bien creo de un tema de configiracion.

    el codigo javascript que lee la tarjeta, estaba en una archivo aparte "WaveId.js", y era referenciado desde la pagina a traves de la directiva <script src="~/Scripts/WaveId.js"></script>"

    esto provocaba que al tratar de parsear la URL

    var url = "@Url.Action('EvaluaAutenticacionEpc', 'Home', new { epc = '_epc' })";
    url = url.replace("_epc", ingreso_teclado);
    location.href = url;

    quedaba mal, y el codigo nunca se parseaba.

    cuando movi este javascript a la pagina cshtml donde se usaba, comenzo a parsear bien el codigo, que llama correctamente al ActionResult del controller.

    Me queda investigar lo que indico leandro a trabves de jquery, pero creo que lo dejare para mañana.

    Muchas gracias Alberto, William, y Leandro, son unos mounstros del .net.

    Saludos


    lunes, 27 de marzo de 2017 22:48