1

我正在使用 asp.net mvc 4 和 web api。我的路线是这样的:

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

例如,如果路线是:

/api/User/jqGrid/List

我希望它会路由到用户控制器的动作名称“jqGrid_List”。

我怎样才能做到这一点?

4

2 回答 2

0

不知道你为什么要这样做。但是您仍然可以在您的用户控制器中创建一个“jqGrid_List”操作并为其设置一个 ActionName,它会起作用。

用户控制器

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

您的路线

routeTemplate: "api/{controller}/jqGrid/{action}/{id}"
于 2012-09-10T06:25:55.073 回答
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 中,如果请求 URL 中存在“jqGrid/”,则修改“action”。

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 回答