我想创建一个自定义操作过滤器属性,在模型绑定(bind)期间可访问的 HttpContext 项中添加一个值。
我已尝试将其添加到 OnActionExecuting 中,但模型绑定(bind)似乎是在过滤器之前执行的。
你知道我该怎么做吗?也许模型绑定(bind)器中有一个我可以覆盖的方法,它将在过滤器之后触发并使用我的过滤器注入(inject)的值。
我想做的,就是注入(inject)一个validation context(我用来验证的库支持context,它是nvalid.net(www.nvalid.net)
我希望能够放置一个属性,例如
[ValidationContext("Prevalidation")]
在我的 actionresult 方法上,以便在我的自定义模型 Binder 中发生的验证可以知道在执行验证时要使用哪个上下文。
这就是为什么我不能简单地制作自定义模型 Binder 的原因。
最佳答案
我找到了实现它的方法。
public class ModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var actionName = controllerContext.RouteData.Values["action"] != null
? controllerContext.RouteData.Values["action"].ToString()
: string.Empty;
var attribute = controllerContext.Controller.GetType().GetMethods()
.Where(x => x.Name == actionName)
.Where(x => x.GetCustomAttributes(false).Any(a => a.GetType() == typeof(CustomActionFilterAttribute)))
.Select(x => x.GetCustomAttributes(typeof(CustomActionFilterAttribute), false).FirstOrDefault())
.FirstOrDefault() as CustomActionFilterAttribute;
if(attribute != null && attribute.AnyProperty)
{
// Do what you want
}
}
}
通过反射我可以找到属性并在我的模型绑定(bind)器中使用它
关于c# - ASP.NET MVC ActionFilterAttribute 在模型绑定(bind)之前注入(inject)值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4266966/