ASP.NET中的过滤器是运行在ASP.NET请求管道中的组件,能够在请求到达控制器动作之前或之后执行特定逻辑,而模型绑定则是将HTTP请求携带的数据转换为控制器动作方法参数的过程,两者都是提升开发效率的重要功能。

ASP.NET过滤器基础与实例
过滤器的常见类型
ASP.NET提供了多种内置过滤器,常用的包括授权过滤器、动作过滤器、结果过滤器和异常过滤器,不同类型的过滤器执行时机不同:
- 授权过滤器:在请求处理的最早阶段执行,用于校验用户权限
- 动作过滤器:在控制器动作方法执行前后执行,可实现日志记录、参数校验等功能
- 结果过滤器:在动作方法返回结果之后、结果执行之前执行
- 异常过滤器:在请求处理过程中出现异常时执行,用于统一异常处理
自定义动作过滤器实例
下面实现一个记录动作方法执行耗时的自定义动作过滤器:
using System.Diagnostics;
using System.Web.Mvc;
// 自定义动作过滤器,继承ActionFilterAttribute
public class ExecutionTimeFilter : ActionFilterAttribute
{
private Stopwatch _stopwatch;
// 动作方法执行前调用
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_stopwatch = Stopwatch.StartNew();
base.OnActionExecuting(filterContext);
}
// 动作方法执行后调用
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
_stopwatch.Stop();
// 将执行耗时存入ViewBag,方便视图展示
filterContext.Controller.ViewBag.ExecutionTime = _stopwatch.ElapsedMilliseconds;
base.OnActionExecuted(filterContext);
}
}
注册该过滤器后,所有标记了该特性的动作方法都会自动记录执行耗时,注册方式可以在控制器或动作方法上直接标记特性:
using System.Web.Mvc;
// 控制器级别应用过滤器,该控制器下所有动作方法都会生效
[ExecutionTimeFilter]
public class UserController : Controller
{
// 动作方法级别应用过滤器,仅该方法生效
[ExecutionTimeFilter]
public ActionResult GetUserList()
{
return View();
}
}
ASP.NET模型绑定基础与实例
默认模型绑定规则
ASP.NET的默认模型绑定器会自动从路由数据、查询字符串、表单数据等位置获取数据,映射到动作方法的参数上。比如下面的动作方法,模型绑定器会自动将请求中的id参数映射到方法的id参数:
using System.Web.Mvc;
public class ProductController : Controller
{
// 请求 /Product/Detail?id=1 时,id会自动绑定为1
public ActionResult Detail(int id)
{
// 业务逻辑处理
return View();
}
}
自定义模型绑定器实例
当默认绑定规则无法满足需求时,可以自定义模型绑定器,比如实现将请求中的JSON字符串自动绑定到复杂对象:
using System.Web.Mvc;
using System.IO;
using System.Web.Script.Serialization;
// 自定义模型绑定器,处理JSON格式的请求数据
public class JsonModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// 读取请求输入流中的JSON数据
using (StreamReader reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
{
string json = reader.ReadToEnd();
if (string.IsNullOrEmpty(json))
{
return null;
}
// 使用JavaScriptSerializer反序列化JSON
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Deserialize(json, bindingContext.ModelType);
}
}
}
注册自定义模型绑定器后,即可在动作方法中使用:
using System.Web.Mvc;
public class OrderController : Controller
{
// 在动作方法参数上指定使用自定义模型绑定器
public ActionResult Create([ModelBinder(typeof(JsonModelBinder))]Order order)
{
// 此时order对象已经通过自定义绑定器从JSON数据转换而来
return View();
}
}
// 订单实体类
public class Order
{
public int OrderId { get; set; }
public string OrderName { get; set; }
public decimal Price { get; set; }
}
过滤器与模型绑定的协同使用
在实际业务中,过滤器和模型绑定可以配合使用,比如通过动作过滤器在模型绑定完成后对参数进行校验:
using System.Web.Mvc;
// 参数校验过滤器
public class ParamValidateFilter : ActionFilterAttribute
{
// 动作方法执行后,模型绑定已经完成,此时校验参数
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
// 获取动作方法的参数
var parameters = filterContext.ActionDescriptor.GetParameters();
foreach (var param in parameters)
{
// 获取参数值
object paramValue = filterContext.Controller.ValueProvider.GetValue(param.ParameterName)?.RawValue;
if (paramValue == null && param.ParameterType.IsValueType && Nullable.GetUnderlyingType(param.ParameterType) == null)
{
// 必填值类型参数为空时,返回错误结果
filterContext.Result = new HttpStatusCodeResult(400, "参数" + param.ParameterName + "不能为空");
break;
}
}
base.OnActionExecuted(filterContext);
}
}
将该过滤器应用到需要参数校验的控制器或动作方法上,即可在模型绑定完成后自动执行参数校验逻辑,减少重复的校验代码。
ASP.NET过滤器模型绑定ActionFilterModelBinder修改时间:2026-07-08 06:51:29