我有一个奇怪/烦人的小虫子,我甚至不知道如何正确解释所以请原谅我,如果这有点罗嗦。此外,对象已被重命名以保护它们;)
我正在研究的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参数可以解决问题。
我的问题(最后)是这样的:如果不采用更改操作方法参数名称,我是如何阻止这种情况发生的?
答案 0 :(得分:1)
您是否尝试过使用 BindAttribute ?
答案 1 :(得分:0)
感谢Jakub。
添加BindAttribute就可以了。
我将动作方法UserObj参数更改为
public ActionResult DoSomeStuffDependingOnPrivileges(string userId, [Bind(Exclude = "userId")] UserObj user)