我有一个ASP.NET MVC 2应用程序,我在其中创建自定义操作筛选器。此过滤器位于应用程序中的控制器上,并从数据库中验证该功能当前是否可用。我可以从Action Filter获取Action的返回类型吗?
Public Overrides Sub OnActionExecuting(ByVal filterContext As System.Web.Mvc.ActionExecutingContext)
Try
' Check controller name against database.
Dim controllerName = filterContext.Controller.GetType().Name
controllerName = controllerName.Remove(controllerName.Length - 10)
' Look up availability.
Dim available As Boolean = _coreService.GetControllerAvailability(controllerName)
If Not available Then
' Redirect to unavailable notice.
filterContext.Result = New RedirectResult("/Home/Unavailable/")
End If
Catch ex As Exception
_eventLogger.LogWarning(ex, EventLogEntryType.Error)
Throw
End Try
End Sub
我的问题是,根据已请求的操作,我需要将用户重定向到返回一个视图,局部视图或JSON的动作。
鉴于ActionExecutingContext我可以找出最初请求的动作的返回类型是什么?编辑:
好吧,我越来越近,但有另一个问题。
Public Overrides Sub OnActionExecuting(ByVal filterContext As System.Web.Mvc.ActionExecutingContext)
Try
' Check controller name against database.
Dim controllerName = filterContext.Controller.GetType().Name
Dim shortName = controllerName.Remove(controllerName.Length - 10)
' Look up availability.
Dim available As Boolean = _coreService.GetControllerAvailability(shortName)
If Not available Then
' find out what type is expected to be returned
Dim actionName As String = filterContext.ActionDescriptor.ActionName
Dim controllerType = Type.GetType("Attenda.Stargate.Web." & controllerName)
Dim actionMethodInfo = controllerType.GetMethod(actionName)
Dim actionReturnType = actionMethodInfo.ReturnType.Name
Select Case actionReturnType
Case "PartialViewResult"
filterContext.Result = New RedirectResult("/Home/UnavailablePartial/")
Case "JsonResult"
filterContext.Result = New RedirectResult("/Home/UnavailableJson/")
Case Else
filterContext.Result = New RedirectResult("/Home/Unavailable/")
End Select
End If
Catch ex As Exception
_eventLogger.LogWarning(ex, EventLogEntryType.Error)
Throw
End Try
End Sub
我可以使用反射来查找操作方法的返回类型。我的问题是如果我在控制器上有以下方法:
Public Function Create() As ViewResult
Return View()
End Function
<AcceptVerbs(HttpVerbs.Post)>
Public Function Create(values as FormCollection) As ViewResult
' Do stuff here
End Function
我得到一个AmbiguousMatchException抛出。
有了OnActionExecuting方法中的信息,是否有更精确的方法来确定被调用的过载?
该网站是为我们的客户门户。我有一些页面,如其他控制器的部分视图的主页。我想返回一个带有消息的部分视图回到父视图。家庭控制器将始终可用,但报告控制器可能不会。报告小部件应该只显示礼貌的消息。 – Nick 2010-05-19 12:39:35
@Nick:那么为什么不只是像filterContext.Result = New PartialViewResult(...)那样做,而不管action方法返回的实际行为结果如何? – 2010-05-19 13:28:29
没关系,如果他们期待部分视图。如果他们击中/报告/索引,虽然他们不会喜欢回头看裸露的partialview。我已经用我使用反射所取得的进展更新了我的问题。 – Nick 2010-05-19 13:52:01