自定义过滤器中不需要的模型绑定

时间:2011-01-17 09:03:02

标签: c# asp.net-mvc filter custom-action

我有一个奇怪/烦人的小虫子,我甚至不知道如何正确解释所以请原谅我,如果这有点罗嗦。此外,对象已被重命名以保护它们;)

我正在研究的MVC网站(我没有启动它,我只是在研究它)有一个自定义过滤器属性,它将参数注入到用所述过滤器修饰的任何动作方法中。该参数保存登录用户的详细信息,用于确定基于角色的权限。见下面的例子:

[UserFilter]
public ActionResult DoSomeStuffDependingOnPrivileges(string userId, UserObj user)

UserObj是一个模型。它看起来有点像这样:

public class User  
{  
    [DisplayName("User ID")]  
    public int UserID { get; set; }

    ...
    ...
    ...

    public IEnumerable<RoleModels.Role> Roles { get; set; }
}

以下是自定义操作过滤器:

public override void OnActionExecuting(ActionExecutingContext filterContext)  
{  
    if (filterContext.ActionParameters.ContainsKey(key))  
    {  
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)  
        {  
            var user = (User)filterContext.HttpContext.Session["User"];
            filterContext.ActionParameters[key] = user;
        }  
    }  

    base.OnActionExecuting(filterContext);
}

因此它的工作方式是过滤器从会话存储值填充UserObj参数。它不会被调用action方法的代码传递。我想这个想法是清理或集中代码或一些如此崇高的意图。

奇怪的是:看看动作方法。我传入一个名为userId的字符串参数。此userId是与UserObj参数中的用户不同的用户ID(将其视为经理员工关系)。当动作过滤器执行时,它会根据需要填充用户参数,但由于某种原因,它会使用传递给动作方法的userId参数(字符串)填充所述用户参数的UserID属性(int),因此即使我使ModelState变为无效不希望验证UserObj模型。

为什么拉里为什么!

解决方法很简单。重命名userId参数可以解决问题。

我的问题(最后)是这样的:如果不采用更改操作方法参数名称,我是如何阻止这种情况发生的?

2 个答案:

答案 0 :(得分:1)

您是否尝试过使用 BindAttribute

答案 1 :(得分:0)

感谢Jakub。

添加BindAttribute就可以了。

我将动作方法UserObj参数更改为

public ActionResult DoSomeStuffDependingOnPrivileges(string userId, [Bind(Exclude = "userId")] UserObj user)