在动作过滤器中获取动作参数的值

时间:2012-03-01 15:21:48

标签: asp.net-mvc-3

我正在从jquery发布一个动作:

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

这适用于groupIdname。我还有其他一些小组操作,所以我想使用授权属性来确保执行更改的人有权进行更改。

我已经有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);
}

我看过这个answer,但我的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 个答案:

答案 0 :(得分:44)

您的代码无效的原因是您将请求作为JSON字符串发送。因此,POST主体中没有请求参数,您无法在Request.Params中获取它们。

所以而不是:

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

使用:

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

这将查询值提供程序(在您的情况下为JsonValueProvider)以获取客户端发送的相应值。

答案 1 :(得分:1)

尝试不使用stringify。我想MVC除了请求参数之外还理解另一种绑定方式 - >动作参数。我想这是json发布的理解。 JQuery,如果你只传递数据对象(没有stringify)会将每个字段作为请求参数发布(至少,我认为是这样)。这很容易尝试:)