Tengo una aplicación ASP.NET MVC 2 en la que estoy creando un filtro de acción personalizado. Este filtro se encuentra en los controladores de la aplicación y verifica desde la base de datos si esa función está actualmente disponible.¿Puedo obtener el tipo de devolución de una acción desde un filtro de acción?
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
Mi problema es que dependiendo de la acción que se ha solicitado que necesito para redirigir al usuario a una acción que devuelve un punto de vista, vistas parciales o JSON.
Dado el ActionExecutingContext ¿puedo averiguar cuál es el tipo de devolución de la acción solicitada originalmente?
EDIT:
Ok, estoy cada vez más cerca, pero tienen otro problema.
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
Puedo usar la reflexión para encontrar el tipo de devolución del método de acción. Mi problema es si tengo los siguientes métodos en un controlador:
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
Me sale una AmbiguousMatchException lanzada.
Con la información que tengo en el método OnActionExecuting, ¿hay alguna forma de ser más preciso para determinar la sobrecarga que se está llamando?
El sitio es un portal para nuestros clientes. Tengo algunas páginas, como la página de inicio con vistas parciales de otros controladores. Quiero devolver una vista parcial con un mensaje de regreso a la vista principal. El controlador doméstico siempre estará disponible, pero el controlador de informes puede no estar disponible. El widget de informes solo debe mostrar un mensaje educado. – Nick
@Nick: ¿por qué no simplemente hacer algo como filterContext.Result = New PartialViewResult (...), independientemente del resultado de la acción real que se devuelva por el método de acción? –
Eso está bien si están esperando la vista parcial. Si presionan/Informes/Indexan, no les agradará que vuelva una vista parcial desnuda. He actualizado mi pregunta con el progreso que he hecho usando la reflexión. – Nick