asp.net mvc 3 - varias - Obtener los valores de los parámetros de acción dentro de un filtro de acción
pasar datos de una vista a un controlador c# (2)
Tengo una acción que estoy haciendo POSTING desde jquery:
[HttpPost]
public void UpdateGroupName(int groupId, string name)
{
authorisationRepository.UpdateGroupName(groupId, name);
}
Esto funciona bien con 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 un AuthorizationAttribute
que recupera el groupId
éxito en solicitudes GET accediendo filterContext.HttpContext.Request.Params["groupId"]
pero cuando se trata de POSTs no funciona. El Request.Form
está vacío y también lo es Request.Params
.
Aquí está el código que tengo en mi atributo de autorización:
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 visto esta respuesta, pero mi propiedad Form
está vacía :(
Actualizado para mostrar la publicación de 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 })
La razón por la 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 Request.Params
.
Entonces, en lugar de:
filterContext.HttpContext.Request.Params["groupId"]
utilizar:
filterContext.Controller.ValueProvider.GetValue("groupId").AttemptedValue
Esto consultará el proveedor de valor (en su caso, el proveedor de valor de Json) para obtener el valor correspondiente enviado por el cliente.
Pruebe sin el stringify. Supongo que MVC está comprendiendo otra forma de vincular además del parámetro de solicitud -> parámetro de acción. Supongo que está entendiendo 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 :)