1

asp.net mvc 4 と Web API を使用しています。私のルートは次のようなものです:

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

たとえば、ルートが次の場合:

/api/User/jqGrid/List

ユーザーコントローラーのアクション名「jqGrid_List」にルーティングされることを願っています。

どうすればこれを達成できますか?

4

2 に答える 2

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;
    }
}

JqG​​ridControllerConfiguration のコードは次のとおりです。

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

JqG​​ridActionSelector では、リクエスト 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);
    }
}
于 2012-09-10T06:19:46.110 に答える