0

大家好,我正在做一个Asp.net core有针对性的项目.Net 5

我创建了一个继承自的类,IActionFilter并使用了OnActionExecution我在其中做了一些逻辑的方法,并想从它重定向ActionController.

问题: 问题是我如何重定向到request来自的操作,我根据我的知识尝试了许多解决方案,但没有人成功。

我尝试了什么:

       public class ValidationFilterAttribute : IActionFilter
        {
            public void OnActionExecuting(ActionExecutingContext context)
            {
                
 //some logic to get the model
                if(!context.ModelState.IsValid)
                {
                    Context.Result = new RedirectToAction(“Idon’t know how to get action”, “I don’t know how to get controller”,new{model= /*model I got*/});
                }
            }
            public void OnActionExecuted(ActionExecutedContext context)
            {          
            }
        }

问题: 我有两个问题,

  1. 如何知道请求的来源Action和名称?Controller
  2. 如何重定向到相同ActionController相同的模型并发送在“OnActionExecution”中获得的相同模型</li>

为什么我这样做: 我的想法是使用我自己的“IActionFilter”类和任何方法HttpPost来检查model发送是否有效,如果无效,OnOnActionExecution方法将添加errorsmodel并再次重新发送到操作。

请对此问题有任何帮助吗?

4

1 回答 1

0

您可以像这样定义自定义 ActionFilter

    public class ValidationFilterAttribute : ActionFilterAttribute
    {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                 var controllerName =  filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; // Get controller name

                 var modelState = (filterContext.Controller. as Controller).ViewData.ModelState; // Get the model state of the request
                 var model = (filterContext.Controller as Controller).ViewData.Model; // Get the model of the request

                 //do your stuff here

                  base.OnActionExecuting(filterContext);
             }
       }

然后注册您的过滤器,以便将其应用于项目中的每个控制器和每个操作

public void ConfigureServices(IServiceCollection services)
{
     services.AddMvcCore(options =>
     {
         options.Filters.Add(typeof(ValidationFilterAttribute));
     });
 }

这样,在点击控制器的操作方法主体之前,每个请求都将通过ValidationFilterAttribute您可以检查他的地方Model并更改他的ModelState.

于 2021-04-17T14:41:49.533 回答