【发布时间】: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