У меня есть приложение ASP.NET MVC 2, в котором я создаю настраиваемый фильтр действий. Этот фильтр находится на контроллерах в приложении и проверяет из базы данных, доступна ли эта функция в настоящее время.Могу ли я получить возвращаемый тип действия из фильтра действий?
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, могу ли я узнать, каков тип возврата первоначально запрошенного действия?
EDIT:
Хорошо, я все ближе, но есть еще одна проблема.
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
@Nick: тогда почему бы просто не сделать что-то вроде filterContext.Result = New PartialViewResult (...), независимо от фактического результата действия, возвращаемого методом действия? –
Это нормально, если они ожидают частичный вид. Если они попадут/Отчеты/Индекс, хотя им не понравится возвращение частичного просмотра. Я обновил свой вопрос с прогрессом, который я сделал с использованием рефлексии. – Nick