【问题标题】:Unwanted Model Binding in Custom Filter自定义过滤器中不需要的模型绑定
【发布时间】:2011-06-10 08:00:39
【问题描述】:

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

我正在处理的 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参数即可解决问题。

我的问题(最后)是:如何在不改变操作方法参数名称的情况下阻止这种情况发生?

【问题讨论】:

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


    【解决方案1】:

    您是否尝试过使用 BindAttribute

    【讨论】:

    • 嗨,Jakub,不,我没有。在这种情况下这将如何工作?我对 MVC 很陌生,所以有很多简短的单词和示例会有所帮助;)
    【解决方案2】:

    谢谢雅库布。

    添加一个 BindAttribute 就可以了。

    我将动作方法UserObj参数改为

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

    【讨论】:

      猜你喜欢
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2013-02-16
      • 1970-01-01
      相关资源
      最近更新 更多