如何将ParentController属性传递给自定义操作筛选器

本文关键字:自定义 操作 筛选 ParentController 属性 | 更新日期: 2023-09-27 18:29:19

我创建了一个Custom Action Filter,它有以下3个属性:

public class TrackUser : ActionFilterAttribute, IActionFilter
{        
    public string BaseUrl { get; set; }
    public string Service { get; set; }
    public HealthUtil.PageCode Pagecode { get; set; }               

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Some logic to execute
    }
}

我正在尝试使用这个客户行动过滤器与我的行动如下:

[TrackUser(BaseUrl =baseUrl, Service =service1, Pagecode =HealthUtil.PageCode.HealthHome)]
public ActionResult AddLead(leadViewModel leaddata)
{
}

属性baseUrl在ParentController类中定义如下:

public static  string baseUrl
{
    get { return "http://localhost:52985/api/"; }
    //set { baseUrl = value; }
}

问题是我无法将baseUrl传递到操作筛选器。我收到以下错误消息:

属性参数必须是属性参数类型的常量表达式、typeof表达式或数组创建表达式

请指导并帮助我解决这个问题。

编辑ParentController中的baseUrl必须是一个属性,因为稍后的代码将从App.Config.

如何将ParentController属性传递给自定义操作筛选器

中读取它

您可以在ParentController中定义一个方法,如下所示:

public class ParentController : Controller
{
    public string GetUrl()
    {
        return ConfigurationManager.AppSettings["AppUrl"];
    }
}

然后在您的过滤器类中,您可以调用父控制器的方法来获得如下url:

public class TrackUser : ActionFilterAttribute, IActionFilter
{
    public string BaseUrl { get; set; }
    public string Service { get; set; }
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Some logic to execute
        var controller = filterContext.Controller as ParentController;
        if (controller != null)
        {
            var url = controller.GetUrl();
            // Use it here
        }
    }
}

希望这有帮助,欢迎跟进问题!

尝试在ParentConroller类中更改baseUrl属性的定义,如下所示。

public const string baseUrl = "http://localhost:52985/api/";

将以下代码添加到TrackUser类的OnActionExecuting方法中

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //get hold of the controller
        var controller = filterContext.Controller as ParentController;
        //assign the BaseUrl property from tye ParentController and use it as required
        BaseUrl = controller.BaseUrl;
        // Some logic to execute
    }

在下面的ParentController' class Change the baseUrl中,

//get the URL from App.Config and assign to baseUrl
public string baseUrl = "http://localhost:52985/api/";

通过删除BaseUrl属性来更新AddLead Action属性,因为它是在TrackUser Action筛选器类中处理的

[TrackUser(Service = service1, Pagecode = HealthUtil.PageCode.HealthHome)]
    public ActionResult AddLead(leadViewModel leaddata)
    {
        //do something with the action
    }`