繁体   English   中英

如何将ParentController属性传递给自定义操作过滤器?

[英]how to pass ParentController Property to custom action filter?

我创建了一个具有3个属性的Custom Action Filter ,如下所示:

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中的EDIT baseUrl必须是一个属性,因为以后的代码将从App.Config中读取它。

尝试在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 ,如下ParentController' class Change the baseUrl`,

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

更新AddLead通过删除Action属性BaseUrl财产,因为它是在处理TrackUser行动过滤器类

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

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

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

然后,在过滤器类中,您可以调用父控制器的方法来获取网址,如下所示:

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
        }
    }
}

希望对您有所帮助,欢迎后续问题!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM