Asp.net 如何根据特定路由将前缀附加到操作名称

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

我正在使用asp.NETMVC4和WebAPI。我的路线是这样的:

/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}”