检查ViewBag是否有一个属性,有条件地注入JavaScript

考虑这个简单的控制器:

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); } 

现在,在我的Create视图中,我想检查ViewBag对象,看它是否有Error属性。 如果它有错误属性,我需要注入一些JavaScript的页面,以显示错误信息给我的用户。

我创build了一个扩展方法来检查这个:

 public static bool Has (this object obj, string propertyName) { Type type = obj.GetType(); return type.GetProperty(propertyName) != null; } 

然后,在“ Create视图中,我编写了这一行代码:

 @if (ViewBag.Has("Error")) { // Injecting JavaScript here } 

但是,我得到这个错误:

无法对空引用执行运行时绑定

任何想法?

你的代码不工作,因为ViewBag是一个dynamic的对象不是一个“真正的”types。

下面的代码应该工作:

 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 } 

而不是使用ViewBag,使用ViewData,所以你可以检查你正在存储的项目。 ViewData对象用作可以通过键引用的对象字典,它不像ViewBag那样是dynamic的。

 // Set the [ViewData][1] in the controller ViewData["hideSearchForm"] = true; // Use the condition in the view if(Convert.ToBoolean(ViewData["hideSearchForm"]) hideSearchForm(); 

我会在这里完全避免ViewBag。 在这里看到我的想法: http : //completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

另一种方法是抛出一个自定义的错误并捕获它。 你怎么知道数据库是否closures,或者如果它的业务逻辑保存错误? 在上面的例子中,您只是捕获一个exception,通常有一个更好的方法来捕获每个exceptiontypes,然后是一个真正的未处理的exception,如内置的自定义错误页面或使用ELMAH的一般exception处理程序。

因此,我会改为ModelState.AddModelError()然后,你可以看看这些错误(假设你不是要使用内置的validation)通过如何从我的视图(Aspx页面)访问ModelState?

因此,请仔细考虑在发现任何exception时显示消息。

你可以使用ViewData.ContainsKey("yourkey")

在控制器中:

 ViewBag.IsExist = true; 

鉴于:

 if(ViewData.ContainsKey("IsExist")) {...}