从ActionFilter中的filterContext读取非原始ActionParameters

时间:2012-03-09 13:26:07

标签: asp.net-mvc action-filter

我目前正在开发一个ASP.NET MVC项目。

我想实现一个ActionFilter,它负责所有权权限。用户只能访问与数据库关联的实体。

现在我不想在每个Controller中实现它。相反,我想使用ActionFilter。 我已经可以使用以下代码识别传入的参数并读取它们的值:

控制器

[Validate(ParameterName = "userID", EntityType="User")]
public ActionMethod Edit(int userID){...

ActionFilter

public string ParameterName { get; set; }
public string EntityType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    if (EntityType != null && ParameterName != null)
    {
        Debug.Print("Checking if user has access to the Type \"" + EntityType + "\" with the
ID " + filterContext.ActionParameters[ParameterName]);
...

到目前为止,这个工作正常。但是当谈到非原始类型(例如User)时,我只在filterContext.ActionParameters [ParameterName]中找到NULL值;

[HttpPost]
[Validate(ParameterName = "user", EntityType = "User")]
public ActionResult Edit(User user)
{....

我无法弄清楚原因。可能是因为这是一个HttpPost方法吗?

1 个答案:

答案 0 :(得分:2)

假设您派生自ActionFilterAttribute并且尚未实现IAuthorizationFilter,这应该可以正常工作,因为如果您实现此接口,则动作过滤器将在模型绑定器之前运行,您将无法获得此模型绑定器的结果,只有简单的HTTP请求值。这是一个例子:

public class User
{
    public string FirstName { get; set; }
}

验证属性:

public class ValidateAttribute : ActionFilterAttribute
{
    public string ParameterName { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var result = (User)filterContext.ActionParameters[ParameterName];
        if (result.FirstName == "john")
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new User
        {
            FirstName = "john"
        });
    }

    [HttpPost]
    [Validate(ParameterName = "user")]
    public ActionResult Index(User user)
    {
        return View(user);
    }
}

查看:

@model User

@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.FirstName)
    <button type="submit">OK</button>
}