none
Enviar datos de un Action a otra Vista RRS feed

  • Pregunta

  • Buenas,

    Tengo el siguiente método de acción:

    [HttpGet]
    [AllowAnonymous]
    public IActionResult Index(int Id, string token)
    {
    	if (Id == 0 || token == null)
    	{
    		return RedirectToAction("AsistenciaVirtualNoDisponible", "AsistenciaVirtual", new { mensaje = "No se han proporcionado los parámetros esperados" });
    	}
    
    	// ...
    	
    	return View();
    }

    La acción a la cual se redirecciona tiene esta forma:

    public IActionResult AsistenciaVirtualNoDisponible(string mensaje)
    {
    	ViewBag.Mensaje = mensaje;
    
    	return View();
    }

    La vista y el mensaje se muestran correctamente, sin embargo, también se muestra el mensaje en la URL y no deseo que esto pase:


    Entiendo que se debe porque en el RedirectToAction le especifico como parámetro, pero si no lo hago y optara por guardarlo en un ViewBag, este no perdura de un Action a otro, solo perdura de un Action a una View. ¿Qué otro objeto puedo utilizar?
    • Editado eduar2083 miércoles, 7 de agosto de 2019 16:45
    miércoles, 7 de agosto de 2019 16:40

Respuestas

Todas las respuestas

  • hola

    El mensaje se visualiza en la url porque la redireccion se realiza por GET

    la unica forma que se me ocurre es que pongas el mensaje en Temp data y lo tomes en el action

    Formas de almacenar datos temporales en Asp.net MVC (ViewData, ViewBag, TempData y Session)

    entonces usarias

    [HttpGet]
    [AllowAnonymous]
    public IActionResult Index(int Id, string token)
    {
    	if (Id == 0 || token == null)
    	{
    		TempData["mensaje"] = "No se han proporcionado los parámetros esperados";
    		return RedirectToAction("AsistenciaVirtualNoDisponible", "AsistenciaVirtual");
    	}
    
    	// ...
    	
    	return View();
    }

    para luego tomarlo

    public IActionResult AsistenciaVirtualNoDisponible(string mensaje)
    {
    	ViewBag.Mensaje = TempData["mensaje"].ToString();
    
    	return View();
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    miércoles, 7 de agosto de 2019 16:54
  • Hola Leandro,

    He agregado el mensaje en un objeto TempData de la siguiente manera:

    TempData["Mensaje"] = "No se han proporcionado los parámetros esperados";

    Pero al recuperarlo en el otro método de acción no tiene la información, llega nulo.

    Quizás haya que configurar algo para utilizar este objeto TempData en Net Core 2.1

    miércoles, 7 de agosto de 2019 17:44
  • Hola eduar2083

    prueba de esta manera

    public IActionResult Index(int id, string token) {
      if (id == 0 || token == null) {
        return View("~/Views/Prueba/MostrarMensaje.cshtml", "Mensaje que queremos mostrar pasado como modelo");
      }
      return View();
    }
    
    // controlador Prueba
    public IActionResult MostrarMensaje(string mensaje) {
        return View(mensaje);
    }

    si te fijas en este caso el mensaje se pasa como modelo del view


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    miércoles, 7 de agosto de 2019 18:51
  • y si es dentro del mismo controlador

            public IActionResult Index(int id, string token) {
                if(id == 0 || token == null) {
                    return View("MostrarMensaje", "Mensaje que queremos mostrar pasado como modelo");
                }
                return View();
            }

    nota!!!, el action no necesita recibir un parametro ya que si revisas la sintaxis del view, se requiere el nombre del view y el objeto que se enviara como modelo del view a retornar


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor


    miércoles, 7 de agosto de 2019 18:56
  • hola

    validaste que la ejecucion pase por la asignacion del valor TempData de esa key?

    puedes poner un breakpoint en el codigo para verificar que sea asignada

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 7 de agosto de 2019 19:26
  • Hola,

    @Marvin, estuve intentando lo que indicas, tengo ambos métodos en el mismo controlador pero me tira error.

    @Leandro, si he puesto punto de interrupción:


    • Editado eduar2083 jueves, 8 de agosto de 2019 0:35
    jueves, 8 de agosto de 2019 0:35
  • hola

    >>Quizás haya que configurar algo para utilizar este objeto TempData en Net Core 2.1

    no me di cuenta que mencionaste net core tenias que haberlo dicho en un principio ya que el TempData por debajo pone el dato en Session o las cookies y este en asp.net core no esta habilitado por defecto

    Use Cookies and Session To Store TempData In ASP.NET Core

    Session and app state in ASP.NET Core

    si habilitas la session el TempData te va a funcionar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta eduar2083 jueves, 8 de agosto de 2019 16:17
    jueves, 8 de agosto de 2019 4:13
  • Hola,

    @Marvin, estuve intentando lo que indicas, tengo ambos métodos en el mismo controlador pero me tira error.

    @Leandro, si he puesto punto de interrupción:


    Cual es el error que te muestra?

    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 8 de agosto de 2019 4:58
  • Hola,

    He agregado la configuración en el método ConfigureServices de Startup.cs

    Y con eso ya funciona.

    Muchas gracias a ambos.

    jueves, 8 de agosto de 2019 16:16