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 では、リクエスト URL に「jqGrid/」が存在する場合、「アクション」が変更されます。
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);
}
}