检查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")) {...}
- ASP.NET MVC 3(Razor)Ajax.ActionLink – 我做错了什么?
- 我们可以在ASP.NET Webforms(* .aspx页面)中使用Razor语法吗?
- Razor ViewEngine:我如何转义“@”符号?
- 如何在razor中指定数据属性,例如@ this.Html.CheckBoxFor(…)上的data-externalid =“23151”
- 从其他控制器呈现部分视图
- 如何在Razor中编写“Html.BeginForm”
- 如何创build自定义validation属性?
- ASP.NET MVC剃刀渲染没有编码
- 剃刀:@ Html.Partial()vs @RenderPage()