如何在 asp.net web api 中传递参数名称 "action"

how to pass parameter name "action" in asp.net web api

无法在 asp.net web api 2.0.api 中通过 url 发送参数名称 "action"。

示例:

http://host:port/controller_name?action=2&...

如果你这样做:

 config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{action}",
                defaults: new
                {
                    action=RouteParameter.Optional
                }
            );

控制器中的方法:

   public HttpResponseMessage Get(int action)
    {
        return ResponseXml();
    }

给出错误信息:

in the dictionary path name of the parameter "action" is contained in the URL-address more than once

如何将参数名称 "action" 作为参数而不是操作方法传递?

谢谢

由于name action包含在querystring部分(?action=2),所以不需要改变route map。框架会将值绑定到操作方法中的操作参数。移除 routeTemplate 中多余的 {action}。由于您的 url 格式不包含 {action} host:port/controller_name?action=2&login=,请从路线图中删除 {action}。 因此,您的路线图将是

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{controller}/{id}",
            defaults: new
            {
                id=RouteParameter.Optional
            }
        );

您可以尝试使用 Attribute Routing 并将其包含在路线模板中。

//GET [controller_route]/2
[HttpGet]
[Route("{action:int}")]
public HttpResponseMessage Get(int action)
{
    return ResponseXml();
}

这将使您可以使用以下 url

http://host:port/controller_name/2

其中 action 参数将映射到 2

记得在配置时启用属性路由。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

        // Convention-based routing.
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}