2012-03-01 10 views
27

Ho un'azione che sto postando da jQuery:Ottenere i valori dei parametri di azione all'interno di un filtro azione

[HttpPost] 
public void UpdateGroupName(int groupId, string name) 
{ 
    authorisationRepository.UpdateGroupName(groupId, name); 
} 

Questo funziona bene con il groupId e name. Ho alcune altre azioni di gruppo, quindi vorrei utilizzare un attributo di autorizzazione per assicurarmi che la persona che esegue la modifica abbia il permesso di apportare la modifica.

ho già un AuthorizationAttribute che recupera il groupId con successo su richieste GET accedendo filterContext.HttpContext.Request.Params["groupId"], ma quando si tratta di POST non funziona. Request.Form è vuoto e lo è anche Request.Params.

Ecco il codice che ho nel mio attributo autorizzazione:

public int groupId { get; set; } 

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    username = httpContext.User.Identity.Name.Split('\\').Last(); 

    // awesome permissions checking goes here... 

    return authorized; 
} 

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    groupId = int.Parse(filterContext.HttpContext.Request.Params["groupId"]); // this line throws an exception 
    base.OnAuthorization(filterContext); 
} 

Ho guardato questo answer ma la mia proprietà Form è vuoto :(

aggiornata per mostrare messaggio jquery:

var serverComm = { 
    post: function (url, data) { 
     return $.ajax({ 
      url: url, 
      type: 'POST', 
      contentType: 'application/json; charset=utf-8', 
      data: JSON.stringify(data) 
     }); 
    }, 
    get: function (url, data) { 
     return $.ajax({ 
      url: url, 
      type: 'GET', 
      cache: false, 
      contentType: 'application/json; charset=utf-8', 
      data: data 
     }); 
    } 
}; 
// some awesome code later... 
serverComm.post(editGroupNameUrl, { groupId: group.id, name: newName }) 
+0

E il parametro è come parametro Form? C'è una possibilità che si trovi su QueryString? – ivowiblo

+0

QueryString è vuoto. E cosa intendi "è come parametro Form"? Puoi vedere la mia azione nell'esempio di codice in alto – soniiic

+0

potresti pubblicare il codice del modulo? – ivowiblo

risposta

42

Il motivo per cui il codice non funziona è perché si sta inviando la richiesta come stringa JSON. Quindi non ci sono parametri di richiesta nel corpo del POST e non è possibile recuperarli nello Request.Params.

Così, invece di:

filterContext.HttpContext.Request.Params["groupId"] 

uso:

filterContext.Controller.ValueProvider.GetValue("groupId").AttemptedValue 

Ciò interrogare il fornitore di valore (nel tuo caso il JsonValueProvider) per ottenere il corrispondente valore invio da parte del cliente.

+0

funzionerà in authorizeattribute? – Dragon

1

Provare senza stringificare Suppongo che MVC stia capendo un altro modo di legare oltre al parametro richiesta -> parametro di azione. sta capendo il json postato. JQuery, se passi solo l'oggetto dati (senza stringificare) pubblicherà ogni campo come parametro di richiesta (almeno, penso di sì). È facile provare :)

Problemi correlati