Получение значений параметров действия в фильтре действий - PullRequest
28 голосов
/ 01 марта 2012

У меня есть действие, которое я отправляю из 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);
}

Я посмотрел на этот ответ , но мое свойство Form пусто: (

Обновлено для отображения поста 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 })

Ответы [ 2 ]

44 голосов
/ 02 марта 2012

Причина, по которой ваш код не работает, заключается в том, что вы отправляете запрос в виде строки JSON.Поэтому в теле POST нет параметров запроса, и вы не можете получить их в Request.Params.

. Вместо:

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

используйте:

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

Это запросит поставщика значений (в вашем случае JsonValueProvider), чтобы получить соответствующее значение, отправленное клиентом.

1 голос
/ 02 марта 2012

Попробуйте без строчки. Я предполагаю, что MVC понимает другой способ связывания, кроме параметра запроса -> параметр действия. Я думаю, что это понимание JSON опубликовал. JQuery, если вы передадите только объект данных (без stringify), опубликует каждое поле как параметр запроса (по крайней мере, я так думаю). Это легко попробовать :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...