我目前正在开发一个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方法吗?
答案 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>
}