2012-10-15 11 views
9

Muszę dać uprawnienia dostępu do użytkowników witryny. robie filtrowanie tutaj:Określić, czy wniosek jest wniosek PartialView lub AJAX w ASP.NET MVC 3

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
} 

Problemem jest to, że nie potrafi odróżnić pełny widok żądania takich jak „Index” z PartialViewRequests lub AJAX wzywa żądań.

Dlatego strona 'Index' ma dostęp, ale 'PartialViewGridViewForIndex' nie ma dostępu.

Właściwość ControllerContext.IsChildAction również nie pomaga.

Odpowiedz

31

Można użyć metody IsAjaxRequest przedłużacza do ustalenia, czy żądanie AJAX został użyty do wywołania tego działania kontrolera:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext.HttpContext.Request.IsAjaxRequest()) 
    { 
     // the controller action was invoked with an AJAX request 
    } 
} 
+0

Dziękujemy! Testuję teraz, aby sprawdzić, czy to działa. wrócę z opinią. –

+0

Testowałem to i to działa. Jednak nie mogę się zastanawiać, czy zadać sobie pytanie, czy renderowanie częściowe jest wykonywane przez żądanie AJAX. Czy masz jakieś idee? –

+0

"IsAjaxRequest" mówi, czy bieżące żądanie było żądaniem AJAX. –

0

Chciałbym utworzyć filtr autoryzacji poprzez rozszerzenie AuthorizeAttribute. Chciałbym wtedy umieścić mój kod w override OnAuthorize. W obiekcie FilterContext możesz spojrzeć na FilterContext.ActionDescriptor.MethodInfo.ReturnType.Name. Dla częściowego widoku będzie to PartialViewResult.

0

można rozszerzyć HttpRequestExtensions w asp.net Core 2 jak poniżej

public static class HttpRequestExtensions 
{ 
    private const string RequestedWithHeader = "X-Requested-With"; 
    private const string XmlHttpRequest = "XMLHttpRequest"; 

    public static bool IsAjaxRequest(this HttpRequest request) 
    { 
     if (request == null) 
     { 
      throw new ArgumentNullException("request"); 
     } 

     if (request.Headers != null) 
     { 
      return request.Headers[RequestedWithHeader] == XmlHttpRequest; 
     } 

     return false; 
    } 
} 

i używać go jako

if (!Request.IsAjaxRequest()) 
{ 
    //---- 
    } 
    else 
    { 
     // ------- 
    } 
Powiązane problemy