2012-03-01 22 views
27

tengo una acción que estoy publicando a partir de jQuery:Obtención de los valores de los parámetros de acción dentro de un filtro de acción

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

Esto funciona bien con el groupId y name. Tengo algunas otras acciones grupales, por lo que me gustaría utilizar un atributo de autorización para asegurarme de que la persona que realiza el cambio tenga permiso para realizar el cambio.

Ya tengo una AuthorizationAttribute que recupera la groupId con éxito en las solicitudes GET accediendo filterContext.HttpContext.Request.Params["groupId"] pero cuando se trata de solicitudes POST no funciona. El Request.Form está vacío y también lo está Request.Params.

Aquí está el código que tengo en mi autorización atributo:

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

He mirado en este answer pero mi propiedad Form está vacía :(

actualiza para mostrar posterior 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

¿Y el parámetro es como parámetro de forma? ¿Hay alguna posibilidad de que esté en QueryString? – ivowiblo

+0

QueryString está vacío. ¿Y a qué te refieres con "es como parámetro de forma"? Puede ver mi acción en el ejemplo de código superior – soniiic

+0

¿podría publicar el código del formulario? – ivowiblo

Respuesta

42

El motivo por el que su código no funciona es porque está enviando su solicitud como una cadena JSON. Por lo tanto, no hay parámetros de solicitud en el cuerpo POST y no puede obtenerlos en el Request.Params.

Así que en lugar de:

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

uso:

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

Este consultará el proveedor de valor (en su caso la JsonValueProvider) para obtener el valor correspondiente a enviar por el cliente.

+0

¿funcionará en authorizeattribute? – Dragon

1

Probar sin el stringify. Supongo que MVC está entendiendo otra forma de enlace además del parámetro de solicitud -> parámetro de acción. Supongo es entender que el json publicado. JQuery, si pasa solo el objeto de datos (sin stringify) publicará cada campo como un parámetro de solicitud (al menos, eso creo). Es fácil de probar :)

Cuestiones relacionadas