Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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# Web API查询字符串未将第二个参数传递给控制器/操作_C#_Query String_Asp.net Web Api - Fatal编程技术网

C# Web API查询字符串未将第二个参数传递给控制器/操作

C# Web API查询字符串未将第二个参数传递给控制器/操作,c#,query-string,asp.net-web-api,C#,Query String,Asp.net Web Api,我有一个Web API应用程序,它将返回患者的临床警报列表。使用以下URL调用该请求 http://myserver:18030/api/Alerts/search?systemId=182&patientId=T000282L 其中,systemId确定与patientID值相关的临床信息系统。路由在WebApiConfig.cs中设置如下 public static void Register(HttpConfiguration config) { conf

我有一个Web API应用程序,它将返回患者的临床警报列表。使用以下URL调用该请求

http://myserver:18030/api/Alerts/search?systemId=182&patientId=T000282L
其中,systemId确定与patientID值相关的临床信息系统。路由在WebApiConfig.cs中设置如下

public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
           name: "Alertsapi",
           routeTemplate: "api/Alerts/search",
           defaults: new { controller = "Alerts" , action = "search"}
       );
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();
控制器动作如下:

    [ActionName("search")]
    public  List<Alert> GetAlerts(string systemId = "", string patientId = "")
    {
        var alerts = from a in db.Alerts
                    where a.alertAuthorReference.Equals(systemId)
                    where a.alertSubjectReference.Equals(patientId)
                    select a;
        return alerts.ToList();
    }
我的印象是QueryString参数自动映射到action方法参数,但在本例中patientId始终为null或空字符串,因为我将其作为默认值提供。我曾尝试在action方法内的代码中读取QueryString,但它只有一个具有密钥systemId的成员

为什么第二个参数没有被传递


我可以通过使用patientId=182:T000282L的查询字符串,然后解析这个复合键来解决这个问题,但我希望最终能够搜索多个参数,因此可能需要访问查询字符串中的第三个甚至第四个值。

您需要为类似的内容定义一个路由

 routes.MapHttpRoute(
             name: "GetPagedData",
             routeTemplate: "api/{controller}/{action}/{pageSize}/{pageNumber}"
        )
你的控制器会像

[HttpGet]
("GetPagedResult")]
HttpResponseMessage GetPagedResult(int StartIndex, int PageSize)
{
         // you can set default values for these parameters like StartIndex = 0 etc.
}

使用WebAPI2和属性路由,您现在可以轻松获得所需的内容

看看这篇文章:

首先,您需要编辑WebApiConfig.cs

public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
           name: "Alertsapi",
           routeTemplate: "api/Alerts/search",
           defaults: new { controller = "Alerts" , action = "search"}
       );
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();
[……]

在您的情况下,您可以测试它在控制器内的工作情况:

    [Route("search")]
    [HttpGet]
    public string search(string systemId = "", string patientId = "")
    {

        return patientId;
    }
并称之为:

http://myserver:18030/search?systemId=182&patientId=T000282L

如果从GetAlerts参数中删除默认值,会发生什么情况?如果我这样做,则两个参数都为null,或者只是patientId?第二个参数。如果我颠倒URL中参数的顺序,它仍然是第二个空参数。此时,我建议尝试一个简单的项目,确保多个参数在那里工作,然后添加自定义路由和操作属性。从以下内容开始。这需要一个URL,例如http://myserver:18030/api/Alerts/search/182/T000282L 用我最初的例子。我希望能够灵活地搜索多个参数。例如我可能想搜索姓名和出生日期,例如?姓氏=琼斯&forename=弗雷德&dob=19450401,我不想为每个搜索参数组合配置单独的路由。为什么不使用自定义对象,例如创建一个包含10个参数的类SearchFilter,默认情况下,这些参数应为null,并且仅用于函数接收该对象并检查给定的参数,从jquery中填写该对象并作为数据传递检查此链接也检查此