Web API QueryString未将第二个参数传递给控制器​​/操作

时间:2014-02-27 17:02:45

标签: 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)
    {
        config.Routes.MapHttpRoute(
           name: "Alertsapi",
           routeTemplate: "api/Alerts/search",
           defaults: new { controller = "Alerts" , action = "search"}
       );

并且控制器操作如下:

    [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参数会自动映射到操作方法参数,但在此示例中,patientId始终为null(或者我将其作为默认值提供空字符串)。我已经尝试在action方法中的代码中读取QueryString,但它只有一个成员具有关键的systemId。

为什么不传递第二个参数?

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

2 个答案:

答案 0 :(得分:0)

您需要为此定义路线

 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.
}

答案 1 :(得分:0)

使用Web API 2和属性路由,您可以轻松获得所需内容。

看一下这篇文章:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

首先,您需要编辑WebApiConfig.cs

    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