Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Zodiak98 en 2 Julio 2017, 18:18 pm



Título: [C#] ¿No se visualiza el contenido del ViewBag?
Publicado por: Zodiak98 en 2 Julio 2017, 18:18 pm
¡Hola! Soy nuevo en el desarrollo web con ASP.NET MVC, y tengo una duda.

Estoy haciendo un sitio web que simplemente rellene una base de datos, pero quiero que una vez el usuario haya ingresado algo en la base de datos, abajo aparezca un mensaje diciendo que la inserción fue exitosa.

Pero cuando intento hacer esto, el mensaje no se muestra.

Esta es la función que llama el form al presionar el submit:
Código
  1. [HttpPost]
  2.        public ActionResult Create(PersonModels person)
  3.        {
  4.            try
  5.            {
  6.                // TODO: Add insert logic here
  7.                //Adding to database and holding the response in the viewbag.
  8.                string strInsertion = ConnectionModels.insertPerson(person);
  9.                ViewBag.InsertionResult = strInsertion;
  10.  
  11.                return RedirectToAction("Index");
  12.            }
  13.            catch
  14.            {
  15.                return View("Index");
  16.            }
  17.        }
  18.  

Y este es el Index:
Código
  1. public ActionResult Index()
  2.        {
  3.            return View();
  4.        }
  5.  

Y pues esto es lo que intento hacer en el index.cshtml
Código
  1. <div>
  2.    <label>
  3.       @ViewBag.InsertionResult
  4.    </label>
  5. </div>
  6.  

Ese div está debajo del form, no lo publico completo porque sería muy extenso.

¡Gracias de antemano! :)


Título: Re: [C#] ¿No se visualiza el contenido del ViewBag?
Publicado por: dato000 en 4 Julio 2017, 17:30 pm
Y el metodo ConnectionModels.insertPerson(person) devuelve un string??

Intenta hacer un debug de que es lo que te devuelve ese metodo.


Título: Re: [C#] ¿No se visualiza el contenido del ViewBag?
Publicado por: 79137913 en 7 Julio 2017, 13:55 pm
HOLA!!!

Para estos casos recomiendo utilizar ViewData("NombreVariable") = Valor para almacenar los datos.

Mas alla de eso si no funciona y no devuelve nada debe ser como dijo @dato000 la variable strInsertion debe estar vacia al momento que seteas el ViewBag, pon un punto de interrupcion y fijate el valor de esa variable al momento del seteo.

Para testear a ver si el problema es la variable vacia podes tambien cambiar esta linea y testear a ver si sale algo o no.
Código
  1. ViewBag.InsertionResult = strInsertion;
  2. //cambiar por
  3. ViewBag.InsertionResult = "prueba";


Cualquier duda extra por favor preguntanos.

GRACIAS POR LEER!!!


Título: Re: [C#] ¿No se visualiza el contenido del ViewBag?
Publicado por: D71 en 12 Julio 2017, 00:37 am
Llego un poco tarde a la fiesta, pero lo suyo es aclarar que el problema se produce porque el ViewBag solo se persiste entre la petición y el render de la vista.

Tu navegador efectua una nueva llamada al Index y el ViewBag se pierde.

Como te han mencionado antes puedes usar ViewData aunque personalmente lo que haria es devolver un boolean de la funcion insertPerson que indica el resultado de la operacion.
En base a ese boolean puedes decidir que mensaje mostrar (y de esta manera separas logica de negocio de la presentacion)


Código
  1. [HttpGet]
  2. public ActionResul Index(bool? success) {
  3.    if(success.HasValue) {
  4.        if(success.Value) {
  5.            ViewBag.InsertionResult = "Entry inserted correctly";
  6.        } else {
  7.            ViewBag.InsertionResult = "There was an issue inserting your entry";
  8.        }
  9.    }
  10.  
  11.    return View();
  12. }
  13.  
  14.  

Código
  1. [HttpPost]
  2. public ActionResult Create(PersonModels person)
  3. {
  4.    try
  5.    {
  6.        // TODO: Add insert logic here
  7.        //Adding to database and holding the response in the viewbag.
  8.        // This could... return a boolean
  9.        var insertResult = ConnectionModels.insertPerson(person);
  10.        return RedirectToAction("Index", new { success = insertResult });
  11.    }
  12.    catch
  13.    {
  14.        return View("Index");
  15.    }
  16. }
  17.