Asp.net 如何根据特定路由将前缀附加到操作名称
我正在使用asp.NETMVC4和WebAPI。我的路线是这样的:Asp.net 如何根据特定路由将前缀附加到操作名称,asp.net,asp.net-web-api,Asp.net,Asp.net Web Api,我正在使用asp.NETMVC4和WebAPI。我的路线是这样的: /api/{controller}/jqGrid/{action}/{id} 例如,如果路线为: /api/User/jqGrid/List 我希望它将路由到用户控制器的操作名“jqGrid_List” 我怎样才能做到这一点呢?嗯,我不知道回答我自己的问题是否可以接受。我找到了解决办法 首先,我需要添加一个JqGridControllerConfiguration属性,用我的属性替换应用于控制器的默认操作选择器 [JqGri
/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;
}
}
在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);
}
}
不知道你为什么要这么做。但是,您仍然可以在用户控制器中创建一个“jqGrid_List”操作,并为其设置一个ActionName,它就会工作 用户控制器:
[HttpGet, ActionName("List")]
public string jqGrid_List()
{
return "WORKS";
}
routeTemplate: "api/{controller}/jqGrid/{action}/{id}"
您的路线:
[HttpGet, ActionName("List")]
public string jqGrid_List()
{
return "WORKS";
}
routeTemplate: "api/{controller}/jqGrid/{action}/{id}"
这真是太过分了,为什么不在操作上使用ActionName(“List”)属性呢?我想在控制器中有两个“List”操作,一个用于常规调用(/User/List),一个用于jqGrid调用(/User/jqGrid/List)。谢谢你的建议。我将在控制器中有两个列表操作,“/User/List”将调用常规列表操作,“/User/jqGrid/List”将调用jqGrid_List方法。我可以创建不同的Url,比如“/User/jqGrid_List”,但我认为“/User/jqGrid/List”可能更友好。将它们命名为两个单独的函数名。你可以给他们两个ActionName“列表”。然后在我在上面的回答中建议的路由之后创建另一个路由,并删除'jqGrid':“api/{controller}/{action}/{id}”