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

时间:2014-11-05 00:25:30

标签: c# asp.net .net asp.net-mvc asp.net-mvc-4

我创建了一个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中读取它。

2 个答案:

答案 0 :(得分:0)

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

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

<击>

将以下代码添加到OnActionExecuting

TrackUser方法中
    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/";

通过删除AddLead属性更新BaseUrl操作属性,因为它在TrackUser操作过滤器类

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

答案 1 :(得分:0)

您可以在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
        }
    }
}

希望这会有所帮助,欢迎提出问题!