我正在使用 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”。
我怎样才能做到这一点?
不知道你为什么要这样做。但是您仍然可以在您的用户控制器中创建一个“jqGrid_List”操作并为其设置一个 ActionName,它会起作用。
用户控制器:
[HttpGet, ActionName("List")]
public string jqGrid_List()
{
return "WORKS";
}
您的路线:
routeTemplate: "api/{controller}/jqGrid/{action}/{id}"
嗯,我不知道回答我自己的问题是否可以接受。我找到了解决方案。
首先,我需要添加一个 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);
}
}