C# Web API查询字符串未将第二个参数传递给控制器/操作
我有一个Web API应用程序,它将返回患者的临床警报列表。使用以下URL调用该请求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
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中填写该对象并作为数据传递检查此链接也检查此