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上选定的一组视图?

谢谢

MVC 3全局条件检查

编写一个扩展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