2012-09-10 33 views
1

我正在使用asp.net mvc 4和web api。我的路線是這樣的:如何根據特定路由追加前綴到動作名稱

/api/{controller}/jqGrid/{action}/{id} 

例如,如果路線是:

/api/User/jqGrid/List 

我希望它會路線的動作名稱的用戶控制的「jqGrid_List」。

我該如何做到這一點?

回答

0

嗯,我不知道回答我自己的問題是否可以接受。我找到了一個解決方案。

首先,我需要添加一個JqGridControllerConfiguration屬性來替換應用於控制器的默認動作選擇器。

[JqGridControllerConfiguration] 
public class UserController : ApiController 
{ 
    // GET: /api/User/jqGrid/List 
    [HttpGet] 
    public JqGridModel<User> jqGrid_List() 
    { 
     JqGridModel<User> result = new JqGridModel<User>(); 
     result.rows = Get(); 
     return result; 
    } 
} 

這裏的JqGridControllerConfiguration的代碼:

public class JqGridControllerConfiguration : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor) 
    { 
     controllerSettings.Services.Replace(typeof(IHttpActionSelector), new JqGridActionSelector()); 
    } 
} 
在JqGridActionSelector

,如果 「的jqGrid /」 請求URL存在於 「動作」 被修改。

public class JqGridActionSelector : ApiControllerActionSelector 
{ 
    public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext) 
    { 
     Uri url = controllerContext.Request.RequestUri; 
     if (url.Segments.Any(s => string.Compare(s, "jqGrid/", true) == 0)) 
     { 
      controllerContext.RouteData.Values["action"] = "jqGrid_" + controllerContext.RouteData.Values["action"].ToString(); 
     } 

     return base.SelectAction(controllerContext); 
    } 
} 
+0

這真的矯枉過正,你爲什麼不使用ActionName( 「名單」)上的action屬性? –

+0

我想在控制器中有兩個「List」動作,一個用於常規調用(/ User/List),另一個用於jqGrid調用(/ User/jqGrid/List)。 – Ricky

0

不知道你爲什麼要這樣做。但是你仍然可以在你的用戶控制器中創建一個「jqGrid_List」動作,併爲它設置一個ActionName,它就可以工作。

UserController的

[HttpGet, ActionName("List")] 
    public string jqGrid_List() 
    { 
     return "WORKS"; 
    } 

路線

routeTemplate: "api/{controller}/jqGrid/{action}/{id}" 
+0

謝謝你的建議。我將在控制器中有兩個List動作,「/ User/List」將調用常規List動作,「/ User/jqGrid/List」將調用jqGrid_List方法。我可以製作不同的Url,如「/ User/jqGrid_List」,但我認爲「/ User/jqGrid/List」可能更友好。 – Ricky

+0

將它們命名爲2個獨立的函數名稱。你可以給它們兩個ActionName「List」。然後在我上面的回答中建議的路線之後創建另一條路線,並刪除'jqGrid':「api/{controller}/{action}/{id}」 – jzm