У меня есть действие, которое я отправляю из jquery:
[HttpPost]
public void UpdateGroupName(int groupId, string name)
{
authorisationRepository.UpdateGroupName(groupId, name);
}
Это прекрасно работает с groupId
и name
. У меня есть несколько других групповых действий, поэтому я хотел бы использовать атрибут авторизации, чтобы убедиться, что человек, выполняющий изменение, имеет разрешение на внесение изменений.
У меня уже есть AuthorizationAttribute
, который успешно извлекает groupId
в запросах GET, обращаясь к filterContext.HttpContext.Request.Params["groupId"]
, но когда дело доходит до POST, это не работает. Request.Form
пуст, как и Request.Params
.
Вот код, который у меня есть в моем атрибуте авторизации:
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);
}
Я просмотрел этот ответ, но мое свойство Форма
пусто :(
Обновлено, чтобы показать сообщение 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 })
Причина, по которой ваш код не работает, заключается в том, что вы отправляете запрос в виде строки JSON. Поэтому в теле POST нет параметров запроса, и вы не можете получить их в Request.Params
.
Таким образом, вместо:
filterContext.HttpContext.Request.Params["groupId"]
используйте:
filterContext.Controller.ValueProvider.GetValue("groupId").AttemptedValue
Это запросит поставщика значений (в вашем случае JsonValueProvider), чтобы получить соответствующее значение, отправленное клиентом.