[英]How to read request body in OnActionExecuting(ActionExecutingContext context) in IActionFilter Asp.net core
[英]How to know if a model or ActionExecutingContext argument is an entity (asp.net core 5)
我正在使用ASP.NET Core 5
開始一個針對.net 5
的新項目。
有時在某些Controllers
的某些Actions
中,我需要檢查收到的model
是否有效,因此我創建了一個ActionFilter
class 以與我想要的任何Action
一起使用,所有這些操作都將是HttpPost
並將收到model
問題是我厭倦了考慮最好的解決方案來知道 model 是否是來自OnActionExecuting
方法的實體,所以我決定讓我的所有實體都從名為IEntity
的interface
繼承並在OnActionExecuting
方法中檢查參數是否繼承自IEntity
並檢查它的值,如下所示。
我嘗試什么:
public class ValidationFilterAttribute : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
var param = context.ActionArguments.SingleOrDefault(p => p.Value is IEntity);
if(param.Value == null)
{
context.Result = new BadRequestObjectResult("Object is null");
return;
}
if(!context.ModelState.IsValid)
{
context.Result = new BadRequestObjectResult(context.ModelState);
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
}
}
問題:
請問有什么好的方法或技術可以知道model
或其中一個context
parameters
是否是不使用接口的實體?
為您的實體類型定義標記接口不是一個壞主意。 但它並不總是適用,具體取決於您的設計。 對於實體類型本身,您無法區分與普通類型的區別。 但是在包含實體類型的DbContext
的幫助下,您可以使用IModel.FindEntityType
方法檢查類型是否為實體類型
public class ValidationFilterAttribute : IActionFilter
{
readonly YourDbContext _dbContext;
public ValidationFilterAttribute(YourDbContext dbContext){
_dbContext = dbContext;
}
public void OnActionExecuting(ActionExecutingContext context)
{
var hasAtLeastOneEntity = context.ActionArguments
.Any(e => e.Value != null &&
_dbContext.Model.FindEntityType(e.Value.GetType()) != null);
if(!hasAtLeastOneEntity)
{
context.Result = new BadRequestObjectResult("Object is null");
return;
}
if(!context.ModelState.IsValid)
{
context.Result = new BadRequestObjectResult(context.ModelState);
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
}
}
在上面的代碼中,我假設您的DbContext
類型是YourDbContext
,您可以將其替換為您的實際DbContext
類型。
性能應該足夠好,但如果您希望它超快(在執行一些基准測試后發現它有點慢),您可以對實體類型應用一些緩存策略。 雖然我不太確定IModel
本身的默認實現是否應該使用一些內部緩存來管理實體類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.