Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Web Api 2-基于属性的路由-如何强制参数仅查询字符串?_C#_Asp.net_Asp.net Web Api_Asp.net Mvc Routing_Query String - Fatal编程技术网

C# ASP.NET Web Api 2-基于属性的路由-如何强制参数仅查询字符串?

C# ASP.NET Web Api 2-基于属性的路由-如何强制参数仅查询字符串?,c#,asp.net,asp.net-web-api,asp.net-mvc-routing,query-string,C#,Asp.net,Asp.net Web Api,Asp.net Mvc Routing,Query String,我正在从事一个WebAPI2项目,我正在使用基于属性的路由。以下是一条示例路线: [路由(“{id:int}”,Name=“GetEmployeeById”)] [HttpGet] 公共IHttpActionResult GetEmployee(内部id) { ... } 这适用于以下URL: ://host/employee/12345 ://主机/员工?id=12345 我希望第一种形式(URI中的参数)是不允许的,只有第二种形式(查询字符串)可以工作 我试过的 大多数情况下,我都试着

我正在从事一个WebAPI2项目,我正在使用基于属性的路由。以下是一条示例路线:

[路由(“{id:int}”,Name=“GetEmployeeById”)]
[HttpGet]
公共IHttpActionResult GetEmployee(内部id)
{
...
}
这适用于以下URL:

  • ://host/employee/12345
  • ://主机/员工?id=12345
我希望第一种形式(URI中的参数)是不允许的,只有第二种形式(查询字符串)可以工作

我试过的 大多数情况下,我都试着在网上搜索一种方法来实现这一点,但我没有找到多少

但是这种语法似乎不起作用了(不再?)


实际上并不会阻止URI表单工作。

实现这一点的两种方法。这里有一些选择

  • 将参数重命名为id以外的内容(例如employeeId)
  • 更改WebApiConfig中的默认路由配置:

        //Default configuration, you can see here the "id" parameter which enables action/id matching
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        //It should look like this
        config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}"
            );
    

  • 您还可以使用自定义属性来执行此操作。

    事实上,我对原始代码的理解是错误的。查询字符串参数不适用于我指定的路由。相反,我可以这样做:

    [路由(“,Name=“GetEmployeeById”)]
    [HttpGet]
    公共IHttpActionResult GetEmployee(内部id)
    {
    ...
    }
    
    这会满足我的要求。它必须从函数的参数列表中获取名称
    id


    不幸的是,这意味着我不能再对它施加约束,但我想我可以在函数中进行验证。

    有一个名为“[FromUri]”的属性,可以用来修饰方法参数,模型绑定器将尝试从查询字符串中查找该参数,在这种情况下,它可能对您没有帮助,但了解它是一件好事,因此,如果您想将搜索选项(例如)传递给Get方法,则可以使用它


    希望对您有所帮助。

    目前,我的整个路由配置如下:
    config.maphttpAttribute路由()。我没有使用模板路由。对我来说,这似乎不能解决我的问题。为什么我要重命名参数
    id
    是我想要的名称,我只希望它只能从查询字符串(而不是URI)设置。我遗漏了什么吗?
    [FromUri]
    似乎强制使用一个参数,该参数通常从查询字符串中获取。这对这个问题没有帮助,但我确实觉得它很有趣;谢谢