2009-10-22 14 views
17

Jaki jest elegancki sposób wykorzystania istniejących atrybutów [HandleError] i [Authorize] podczas obsługi wywołań XHR z javascript?asp.net mvc [handleerror] [autoryzuj] z JsonResult?

Powiedzmy na przykład o metodzie GetJson, która zwraca wartość JsonResult.

Po wystąpieniu błędu metoda [HandleError] odeśle widok ViewResult, który zostanie odzyskany w funkcji wywołania zwrotnego w javascript.

bym wtedy trzeba umieścić kod niestandardowy wszędzie w javascript w obsłudze i przekierowywać żadnych awarii itp

Co chciałbym zrobić, to mieć [HandleError] przypisują zwrócić JsonResult Jeśli oryginał działanie planowało to zrobić. To może być myślenie życzeniowe z mojej strony.

Podobnie, jeśli pojawi się nieautoryzowane żądanie Json, zamiast zwracania nowego HttpUnauthorizedResult, chciałbym zwrócić JsonResult, który pozwala mojemu kodowi po stronie klienta na obsługę rzeczy w zwykły sposób.

Czy szczerzę tu niewłaściwe drzewo? Może jest jeszcze lepszy sposób, w jaki MVC może sobie z tym poradzić, czego nie jestem świadomy?

W jaki sposób inne osoby obsługują ten scenariusz?

Dzięki.

PS: Rozumiem, że mogę stworzyć własne atrybuty [HandleJsonError] i [AuthorizeJson], które zwrócą JsonResults zamiast ViewResults, ale wtedy będę musiał je obejść i umieścić na dowolnej metodzie zwracającej Json, i martwić się Kolejność filtrowania itp. Byłoby dobrze, gdybym mógł użyć odbicia lub czegoś, co miałoby ten sam atrybut, gdyby działał inaczej, w zależności od podpisu oryginalnej metody.

Odpowiedz

27

Nie. W tej chwili nie pomagają JSONowi. Jednakże:

Zdaję sobie sprawę, mogę tworzyć własne [HandleJsonError] i [AuthorizeJson] atrybuty, które zwracają JsonResults zamiast ViewResults, ale wtedy musiałbym przejść wokół i umieścić je na dowolnej metody, która zwraca JSON, i martwić o kolejność filtrów itp

Co zrobiliśmy to podtypu istniejące atrybuty i ich pracy warunkowo:

public sealed class AjaxAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     if (filterContext.Result == null) 
     { 
      return; 
     } 
     else if (filterContext.Result.GetType() == typeof(HttpUnauthorizedResult) 
      && filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = new ContentResult(); 
      filterContext.HttpContext.Response.StatusCode = 403; 
     } 
    } 
} 

teraz kod JS może wyglądać fo r 403 (ponieważ ASP.NET spożywa 401 i zwraca stronę błędu) i ten sam atrybut działa dla Ajax i non-Ajax. Więc nie ma problemów z zamówieniem filtru.

+0

Dzięki! Request.IsAjaxRequest() jest bardzo pomocny. Nie wiedziałem, że to istnieje. – Scott

+0

Jest to metoda rozszerzenia, którą dodaje MVC. To w rzeczywistości nie jest częścią Żądania. –

+1

Dzięki! To bardzo elegancki sposób i powinien być oznaczony jako poprawna odpowiedź. Konstruktor nie jest jednak potrzebny. –

Powiązane problemy