MVC 3全局条件检查
本文关键字:检查 条件 全局 MVC | 更新日期: 2023-09-27 18:15:37
我有一个函数返回真/假…像这样....
Shared Function CartHasItems() As Boolean
If HttpContext.Current.Session("ASPNETShoppingCart") Is Nothing Then
Return False
Else
If CType(HttpContext.Current.Session("ASPNETShoppingCart"), ShoppingCart).Items.Count > 0 Then
Return True
Else
Return False
End If
Return True
End If
End Function
现在有几页我必须检查这个函数是否返回真/假…如果FALSE则显示消息并重定向到页面…如果为TRUE,则不发生任何事情。
我的问题是……我有很多页面(视图),我必须调用这个函数来进行条件检查和处理....现在我像这样手动操作....<% If ViewData("CartSession") Then %>
We have Items
<% Else %>
No Items
<% End If%>
我可以告诉,这不是正确的方式做....有这么多的视图,看起来就像我在一遍又一遍地重复我的代码。
在webforms我使用的基类,我使用的page_load事件的基类做重复的任务,我怎么能做到这一点在MVC上选定的一组视图?
谢谢
编写一个扩展HtmlHelper的方法。
有关如何这样做的更多信息:http://develoq.net/2011/how-to-create-custom-html-helpers-for-asp-net-mvc-3-and-razor-view-engine/
你也可以把这个逻辑放到共享视图目录下的Paris视图中。
或者你可以为你所有的视图创建一个基类,并把它放在那里:http://haacked.com/archive/2011/02/21/changing-base-type-of-a-razor-view.aspx
感谢"神秘人"给我指明了正确的方向。ActionFilterAttribute was the Answer…我创建了一个自定义动作过滤器....现在我可以将动作过滤器应用到任何动作方法甚至整个控制器上。下面是代码示例。
Public Class CartCheckFilter
Inherits ActionFilterAttribute
Public Overrides Sub OnActionExecuting(filterContext As ActionExecutingContext)
If HttpContext.Current.Session("ASPNETShoppingCart") Is Nothing Then
Dim redirectTarget = New RouteValueDictionary() From { _
{"action", "noCartData"}, _
{"controller", "Checkout"} _
}
filterContext.Result = New RedirectToRouteResult(redirectTarget)
Else
If CType(HttpContext.Current.Session("ASPNETShoppingCart"), ShoppingCart).Items.Count <= 0 Then
Dim redirectTarget = New RouteValueDictionary() From { _
{"action", "noCartData"}, _
{"controller", "checkout"} _
}
filterContext.Result = New RedirectToRouteResult(redirectTarget)
End If
End If
End Sub
这就是我如何实现这个ActionFilter:
<CartCheckFilter()>
Function Index() As ActionResult
Return View()
End Function