2009-10-22 18 views
17

Qual è un modo elegante per sfruttare gli attributi [HandleError] e [Autorizza] esistenti quando si gestiscono chiamate XHR da javascript?asp.net mvc [handleerror] [autorizzazione] con JsonResult?

Quindi, ad esempio, un metodo GetJson che restituisce un JsonResult.

Quando si verifica un errore, il metodo [HandleError] invierà un ViewResult che verrà recuperato nella funzione di callback in javascript.

avrei poi dovuto inserire codice personalizzato in tutto il mondo in javascript per gestire e reindirizzare eventuali incidenti, ecc

Quello che mi piacerebbe fare, è avere il [HandleError] attributo restituisce un JsonResult se l'originale l'azione prevedeva di farlo. Questo potrebbe essere un pio desiderio da parte mia.

Analogamente, se arriva una richiesta JSON non autorizzata, invece di restituire un nuovo HttpUnauthorizedResult, desidero restituire un JsonResult che permetta al mio codice lato client di gestire le cose in un modo comune.

Sto abbaiando sull'albero sbagliato qui? Forse c'è un modo ancora più bello in cui MVC può gestire ciò di cui non sono a conoscenza?

In che modo le altre persone gestiscono questo scenario?

Grazie.

PS: Mi rendo conto che posso creare i miei attributi [HandleJsonError] e [AuthorizeJson] che restituiscono JsonResults invece di ViewResults, ma poi dovrei andare in giro e posizionarli su qualsiasi metodo che restituisce Json, e preoccuparmi di Ordine filtro ecc. Sarebbe bello se potessi usare la riflessione o qualcosa del genere per fare in modo che lo stesso attributo agisse in modo diverso a seconda della firma del metodo originale.

risposta

27

Non è così. In questo momento, non aiutano con JSON. Tuttavia:

mi rendo conto che posso creare il mio [HandleJsonError] e [] AuthorizeJson attributi che ritorno JsonResults invece di ViewResults, ma poi avrei dovuto andare in giro e mettere questi su qualsiasi metodo che restituisce JSON, e preoccuparsi di ordine del filtro ecc

Quello che abbiamo fatto è quello di sottotipo gli attributi esistenti, e farli lavorare in modo condizionale:

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; 
     } 
    } 
} 

Ora il codice JS può guardare fo r 403 (poiché ASP.NET mangia 401 e restituisce la pagina di errore) e lo stesso attributo funziona per Ajax e non Ajax. Quindi nessun problema con l'ordine del filtro.

+0

Grazie! Request.IsAjaxRequest() è molto utile. Non sapevo che esistesse. – Scott

+0

È un metodo di estensione che MVC aggiunge. In realtà non fa parte della richiesta. –

+1

Grazie! Questo è un modo molto elegante e dovrebbe essere contrassegnato come la risposta corretta. Il costruttore non è necessario però. –

Problemi correlati