34

考虑这个简单的控制器:

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,以向我的用户显示错误消息。

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

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
}

但是,我收到此错误:

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

任何想法?

4

6 回答 6

99
@if (ViewBag.Error!=null)
{
    // Injecting JavaScript here
}
于 2012-06-22T08:09:36.557 回答
22

您的代码不起作用,因为 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);
}
于 2012-09-10T16:16:56.700 回答
4

不要使用 ViewBag,而是使用 ViewData,这样您就可以检查您正在存储的项目。ViewData 对象用作您可以通过键引用的对象的字典,它不像 ViewBag 那样是动态的。

// Set the [ViewData][1] in the controller
ViewData["hideSearchForm"] = true;    

// Use the condition in the view
if(Convert.ToBoolean(ViewData["hideSearchForm"])
    hideSearchForm();
于 2012-06-05T19:58:49.253 回答
3

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

在控制器中:

ViewBag.IsExist = true;

鉴于:

if(ViewData.ContainsKey("IsExist")) {...}
于 2015-04-29T16:13:31.893 回答
3

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

另一种方法是抛出一个自定义错误并捕获它。您如何知道数据库是否已关闭,或者是否是业务逻辑保存错误?在上面的示例中,您只捕获一个异常,通常有更好的方法来捕获每种异常类型,然后是针对真正未处理的异常的通用异常处理程序,例如内置的自定义错误页面或使用 ELMAH。

因此,在上面,我将改为 ModelState.AddModelError() 然后您可以通过如何从我的视图(aspx 页面)中访问模型状态来查看这些错误(假设您不打算使用内置验证 )?

因此,当您捕获“任何”异常时,请仔细考虑显示一条消息。

于 2011-12-27T04:02:10.330 回答
0

我需要对此进行测试,但是:

@if (ViewBag.ABoolParam ?? false)
{
    //do stuff
}

我认为会给您 ViewBag 属性的值,或者如果缺少则返回默认值。

于 2021-07-15T18:13:00.263 回答