我正在使用asp.net mvc 4和web api。我的路線是這樣的:如何根據特定路由追加前綴到動作名稱
/api/{controller}/jqGrid/{action}/{id}
例如,如果路線是:
/api/User/jqGrid/List
我希望它會路線的動作名稱的用戶控制的「jqGrid_List」。
我該如何做到這一點?
我正在使用asp.net mvc 4和web api。我的路線是這樣的:如何根據特定路由追加前綴到動作名稱
/api/{controller}/jqGrid/{action}/{id}
例如,如果路線是:
/api/User/jqGrid/List
我希望它會路線的動作名稱的用戶控制的「jqGrid_List」。
我該如何做到這一點?
嗯,我不知道回答我自己的問題是否可以接受。我找到了一個解決方案。
首先,我需要添加一個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);
}
}
不知道你爲什麼要這樣做。但是你仍然可以在你的用戶控制器中創建一個「jqGrid_List」動作,併爲它設置一個ActionName,它就可以工作。
UserController的:
[HttpGet, ActionName("List")]
public string jqGrid_List()
{
return "WORKS";
}
你路線:
routeTemplate: "api/{controller}/jqGrid/{action}/{id}"
這真的矯枉過正,你爲什麼不使用ActionName( 「名單」)上的action屬性? –
我想在控制器中有兩個「List」動作,一個用於常規調用(/ User/List),另一個用於jqGrid調用(/ User/jqGrid/List)。 – Ricky