[C#] ¿No se visualiza el contenido del ViewBag?

Iniciado por Zodiak98, 2 Julio 2017, 18:18 PM

0 Miembros y 1 Visitante están viendo este tema.

Zodiak98

¡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 (cpp) [Seleccionar]

[HttpPost]
        public ActionResult Create(PersonModels person)
        {
            try
            {
                // TODO: Add insert logic here
                //Adding to database and holding the response in the viewbag.
                string strInsertion = ConnectionModels.insertPerson(person);
                ViewBag.InsertionResult = strInsertion;

                return RedirectToAction("Index");
            }
            catch
            {
                return View("Index");
            }
        }


Y este es el Index:
Código (cpp) [Seleccionar]

public ActionResult Index()
        {
            return View();
        }


Y pues esto es lo que intento hacer en el index.cshtml
Código (html) [Seleccionar]

<div>
    <label>
       @ViewBag.InsertionResult
    </label>
</div>


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

¡Gracias de antemano! :)

dato000

Y el metodo ConnectionModels.insertPerson(person) devuelve un string??

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



79137913

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 (csharp) [Seleccionar]
ViewBag.InsertionResult = strInsertion;
//cambiar por
ViewBag.InsertionResult = "prueba";



Cualquier duda extra por favor preguntanos.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

D71

#3
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 (csharp) [Seleccionar]

[HttpGet]
public ActionResul Index(bool? success) {
    if(success.HasValue) {
        if(success.Value) {
            ViewBag.InsertionResult = "Entry inserted correctly";
        } else {
            ViewBag.InsertionResult = "There was an issue inserting your entry";
        }
    }

    return View();
}



Código (csharp) [Seleccionar]

[HttpPost]
public ActionResult Create(PersonModels person)
{
    try
    {
        // TODO: Add insert logic here
        //Adding to database and holding the response in the viewbag.
        // This could... return a boolean
        var insertResult = ConnectionModels.insertPerson(person);
        return RedirectToAction("Index", new { success = insertResult });
    }
    catch
    {
        return View("Index");
    }
}