c# - ASP.NET MVC ActionFilterAttribute 在模型绑定(bind)之前注入(inject)值

标签 c# .net asp.net asp.net-mvc asp.net-mvc-3

我想创建一个自定义操作过滤器属性,在模型绑定(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/

相关文章:

c# - 使用 Magick.NET 启用 OpenCL

c# - 如何使用 Entity Framework 添加对象而不复制其关联实体

asp.net - Web.Config 使用换行符进行转换

C# 2.0 代码使用使用 C# 3.0 编译的程序集

c# - 在条件断点中使用 Linq 的 Visual Studio 2015

c# - .NET 二进制文件的哈希值可以用于检查底层源代码是否已更改

jquery - 即时向表格的 <td> 元素添加属性

javascript - 如何使用 javascript 设置 .net 标记帮助程序属性中的值?

c# - 是否可以在 MVC3 (C#) 中为 `[Display(Name="Something")]` 数据注释使用变量

javascript - AjaxControl工具包:TabPanel