2014-11-05 107 views
0

我創建瞭如下一個Custom Action Filter有3個屬性:如何將ParentController屬性傳遞給自定義操作篩選器?

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屬性參數類型

請引導和幫助我解決這個問題的表達式或數組創建表達式。

編輯 baseUrl在ParentController必須有一個屬性,因爲後面的代碼將App.Config中讀取它。

回答

0

嘗試在ParentConroller類中更改baseUrl屬性的定義,如下所示。

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

添加以下代碼以方法的TrackUserOnActionExecuting

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 
    }` 
+0

它必須屬性,因爲我會讀取這個值的形式App.Config 請任何建議。 – user576510 2014-11-05 00:41:32

+0

@ user576510它不能動態,錯誤信息甚至會告訴你。 – DavidG 2014-11-05 01:02:08

0

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

希望這會有所幫助,跟進問題歡迎!

相關問題