Web Api方法接受字符串,整数,字母数字

时间:2015-09-03 17:01:37

标签: c# asp.net-mvc-4 asp.net-web-api2 asp.net-web-api

我正在研究一些Web Api方法,并遇到了我们传递三种不同类型参数的场景:数字,字符串和字母数字值。

这是我的路由信息​​:

string alphanumeric = @"^[a-zA-Z]+[a-zA-Z0-9,_ -]*$";
string numeric = @"^\d+$";

config.Routes.MapHttpRoute(
   name: "DefaultApiControllerActionName",
   routeTemplate: "api/{controller}/{action}/{name}",
   defaults: null,
   constraints: new { action = alphanumeric }
);

config.Routes.MapHttpRoute(
   name: "DefaultApiControllerActionId",
   routeTemplate: "api/{controller}/{action}/{id}",
   defaults: null,
   constraints: new { action = alphanumeric, id = numeric }
);

使用此路线信息,我可以获得字符串和字母数字值,但不能获得数字(通过相同的方法)。这是我的代码:

public IEnumerable<Deliveries> GetByAdvanced(string name)
{
    var deliveries = ...

    return deliveries;
}

e.g。示例Web API URL

现在,如果我只是为了处理int值而添加另一个方法,那么它的工作原理非常好。例如

下面的代码
public IEnumerable<Deliveries> GetByAdvanced(int id)
{
    var deliveries = ...

    return deliveries;
}

这是接受这些值的正确方法吗?

2 个答案:

答案 0 :(得分:3)

如果它只影响一种方法,那么您可以在控制器中尝试Attribute Routing而不是修改路由配置。

尝试类似下面的内容

[Route("Api/Deliveries/{id}/{StringVal}/{AlphaVal}")]
public IEnumerable<Deliveries> GetByAdvanced(int id, string StringVal, string AlphaVal)
{
  var deliveries = ...

  return deliveries;
}

答案 1 :(得分:0)

查看您的示例Web API网址,他们都应该工作 我使用以下配置创建了两个简单的新Web项目:
1)MVC4,Web Api和.NET 4
2)MVC 5,Web Api 2.2和.NET 4.5.1
我使用了与您提供的相同的路由和控制器中的相同操作方法,并且所有示例执行都正常工作。如何查看整个web api配置文件?您是否已在操作方法或控制器上定义了一些其他路由,但您没有向我们展示?

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

            string alphanumeric = @"^[a-zA-Z]+[a-zA-Z0-9,_ -]*$";
            string numeric = @"^\d+$";

            config.Routes.MapHttpRoute(
               name: "DefaultApiControllerActionName",
               routeTemplate: "api/{controller}/{action}/{name}",
               defaults: null,
               constraints: new { action = alphanumeric }
            );

            config.Routes.MapHttpRoute(
               name: "DefaultApiControllerActionId",
               routeTemplate: "api/{controller}/{action}/{id}",
               defaults: null,
               constraints: new { action = alphanumeric, id = numeric }
            );
        }
    }

控制器:

    public class DeliveryController : ApiController
    {
        public string GetByAdvanced(string name)
        {
            return name;
        }
    }


BTW。为什么要为动作名称指定约束?