检查ViewBag是否具有属性,以有条件地注入JavaScript

Sae*_*ati 33 null dynamic razor viewbag asp.net-mvc-3

考虑这个简单的控制器

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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

@if (ViewBag.Has("Error"))
{
    // Injecting JavaScript here
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

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

任何的想法?

jaz*_*cat 99

@if (ViewBag.Error!=null)
{
    // Injecting JavaScript here
}
Run Code Online (Sandbox Code Playgroud)

  • @SaeedNeamati,jazzcat的代码对我来说很好.对于ViewBag,任何未找到的项目都将为null.请记住,动态最终会有一些实际的代码.ViewBag是一个DynamicViewDataDictionary,显然决定为不存在的"属性"返回null而不是抛出错误. (20认同)
  • 实际上,你可以通过一些其他魔法改善这一点; @if(ViewBag.Error ?? false).如果您设置了布尔值,它将起作用. (12认同)
  • 亲爱的@jazzcat,请先检查您的代码,然后发送.如果我没有在我的控制器中设置`ViewBag.Error`,这意味着ViewBag在运行时将没有名为`Error`的属性,那么我将遇到异常. (4认同)
  • 这应该是选择的答案! (4认同)

Jef*_*ker 21

您的代码不起作用,因为ViewBag是一个动态对象而不是"真实"类型.

以下代码应该工作:

public static bool Has (this object obj, string propertyName) 
{
    var dynamic = obj as DynamicObject;
    if(dynamic == null) return false;
    return dynamic.GetDynamicMemberNames().Contains(propertyName);
}
Run Code Online (Sandbox Code Playgroud)

  • 似乎我应该像`((Object)ViewBag).Has("PropertyName")`那样使用它. (3认同)