c# - 如何将参数传递给通用动作过滤器
问题描述
我正在开发一个Asp.net core 5
目标项目.Net 5
,我尝试创建一个Action filter
将接收属性名称的项目,他将收到一个TEntity
通用类型(表示要从中选择的表)并捕获提交model
并从中获取属性值(model
),如果一条记录在传入的表中的过去属性中已经具有相同的值,这Action Filter
将在数据库中查找TEntity
。
我的操作过滤器:
public class RecordShouldNotExistFilter<TEntity>:IActionFilter where TEntity : class
{
private readonly AppDbContext _dbContext;
public string PropertyToBeChecked { get; set; }
public RecordShouldNotExistFilter( AppDbContext dbContext )
{
_dbContext = dbContext;
}
public void OnActionExecuting( ActionExecutingContext context )
{
// Some logic here that uses the PropertyToBeChecked's value
}
}
public void OnActionExecuted( ActionExecutedContext context )
{
}
}
问题:
当我尝试对我的操作应用过滤器时,我不知道如何传递PropertyToBeChecked
值。
我在这里停了下来:
[TypeFilter(typeof(RecordShouldNotExistFilter<PedagogicalSequence>))]
public async Task<IActionResult> Create( PedagogicalSequenceModel model )
{
}
问题:
如何传递PropertyToBeChecked
价值?或者如何用另一种方式实现我的目标?除了使用Action
参数
解决方案
您可以在过滤器的构造函数中检查要检查的属性,如下所示:
public RecordShouldNotExistFilter(AppDbContext dbContext, string propertyToBeChecked)
{
_dbContext = dbContext;
PropertyToBeChecked = propertyToBeChecked;
}
然后将该值传递给过滤器属性:
[TypeFilter(typeof(RecordShouldNotExistFilter<PedagogicalSequence>), Arguments = new object[] { "PropertyName" })]
public async Task<IActionResult> Create(PedagogicalSequenceModel model)
{
}
不支持通用属性,因此您的另一个选择是在此答案之后创建一个非通用属性并通过Type
参数获取实体类型。然后,您将使用反射来获取通用实现:
public class RecordShouldNotExistFilterAttribute : TypeFilterAttribute
{
public RecordShouldNotExistFilterAttribute(Type entityType, string propertyToBeChecked)
: base(typeof(RecordShouldNotExistFilter<>).MakeGenericType(entityType))
{
Arguments = new object[] { propertyToBeChecked };
}
}
public class RecordShouldNotExistFilter<TEntity> : IActionFilter where TEntity : class
{
readonly AppDbContext _dbContext;
public string PropertyToBeChecked { get; set; }
public RecordShouldNotExistFilter(AppDbContext dbContext, string propertyToBeChecked)
{
_dbContext = dbContext;
PropertyToBeChecked = propertyToBeChecked;
}
}
这将允许您这样做:
[RecordShouldNotExistFilter(typeof(PedagogicalSequenceModel), "PropertyName")]
public async Task<IActionResult> Create(PedagogicalSequenceModel model)
推荐阅读
- flutter - NoSuchMethodError:在 null 上调用了方法“rawinsert”
- java - Java Jdatechooser 前台
- python - 在 python 中将 List 转换为 Json,因此可以通过使用 Key 来访问
- perl - Perl 命令更改文件 EOL 并以相同的名称保存文件
- java - Cucumber Java - JUnit 在命令行上设置单色
- php - 从前端表单向新帖子添加一些图像?
- javascript - 从 C# 到 javascript 的日期时间格式
- c# - 不使用 jObject 反序列化 json
- spring - 在春季为特定文件/文件夹设置缓存控制
- flutter - 火种上的动画就像图像滑动颤动