簡體   English   中英

如何知道 model 或 ActionExecutingContext 參數是否是實體(asp.net core 5)

[英]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方法的實體,所以我決定讓我的所有實體都從名為IEntityinterface繼承並在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM