asp.net mvc 3 - net - Comprobando para ver si ViewBag tiene una propiedad o no, para inyectar condicionalmente JavaScript
viewbag razor (5)
En lugar de usar ViewBag, use ViewData para poder verificar el elemento que está almacenando. El objeto ViewData se utiliza como Diccionario de objetos que puede referenciar por clave, no es una dinámica como ViewBag.
// Set the [ViewData][1] in the controller
ViewData["hideSearchForm"] = true;
// Use the condition in the view
if(Convert.ToBoolean(ViewData["hideSearchForm"])
hideSearchForm();
Considere este simple controlador:
Porduct product = new Product(){
// Creating a product object;
};
try
{
productManager.SaveProduct(product);
return RedirectToAction("List");
}
catch (Exception ex)
{
ViewBag.ErrorMessage = ex.Message;
return View("Create", product);
}
Ahora, en mi vista Create
, quiero verificar el objeto ViewBag
, para ver si tiene la propiedad Error
o no. Si tiene la propiedad de error, necesito insertar JavaScript en la página para mostrar el mensaje de error a mi usuario.
Creé un método de extensión para verificar esto:
public static bool Has (this object obj, string propertyName)
{
Type type = obj.GetType();
return type.GetProperty(propertyName) != null;
}
Luego, en la vista Create
, escribí esta línea de código:
@if (ViewBag.Has("Error"))
{
// Injecting JavaScript here
}
Sin embargo, me sale este error:
No se puede ejecutar el enlace de tiempo de ejecución en una referencia nula
¿Alguna idea?
Evitaría ViewBag aquí por completo. Vea mis pensamientos aquí sobre esto: http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html
La alternativa sería arrojar un error personalizado y atraparlo. ¿Cómo sabe si la base de datos está inactiva o si es un error de guardar la lógica de negocios? en el ejemplo anterior, solo capta una única excepción; en general, hay una forma mejor de detectar cada tipo de excepción y, a continuación, un controlador de excepción general para las excepciones realmente no controladas, como las páginas de error personalizadas integradas o el uso de ELMAH.
Entonces, en lugar de eso, preferiría ModelState.AddModelError () Luego puede ver estos errores (suponiendo que no va a usar la validación incorporada) a través de ¿Cómo accedo a ModelState desde mi Vista (página aspx)?
Por lo tanto, considere mostrar un mensaje cuidadosamente cuando atrape ''cualquier'' excepción.
Puede usar ViewData.ContainsKey("yourkey")
.
En el controlador:
ViewBag.IsExist = true;
En vista:
if(ViewData.ContainsKey("IsExist")) {...}
Su código no funciona porque ViewBag es un objeto dinámico no un tipo ''real''.
el siguiente código debería funcionar:
public static bool Has (this object obj, string propertyName)
{
var dynamic = obj as DynamicObject;
if(dynamic == null) return false;
return dynamic.GetDynamicMemberNames().Contains(propertyName);
}
@if (ViewBag.Error!=null)
{
// Injecting JavaScript here
}