我对API和MVC比较陌生,我还在学习。通过检索(所有)数据、更新、添加和删除,我只完成了Web API和客户端MVC(GET、PUT、POST、DEL)的基础知识。这是我的老师用来上课的主要指南。http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-1
我目前正在学期休息,正在独自探索。我遇到过一个特定的任务,它是通过大约10个参数的过滤器显示项目列表,其中大多数都是可选字段。字段:名称、形状、颜色、签名、产品代码等。大多数字段都可以为null,只有少数字段是下拉列表。
大多数指南和教程都会给我举1的例子,或者可能有一些参数,但这项任务需要的不仅仅是这些。
这里的问题是,我不知道如何将这么多参数从MVC客户端传递到API。我读过很多其他解决方案,可以将它们作为URI 传递
baseuri/action?a=&b=&c=1&d=example
但是,我怎么能忽略从未填充过的空字段,只搜索数据库中实际填充的字段呢?
baseuri/action?a=&b=&c=1&d=example
//ignoring a and b
var result = from b in db.table where (c==1 && d==example)
我的老师建议我制作自己的控制器和功能,但我不太确定该怎么做
有一些解决方案建议我使用[FromURI],但搜索功能太复杂,我也不太确定如何使用[FromBody]。
有什么帮助吗?
要忽略空字段,您可以将参数设为null,并仅在参数有值时按其进行筛选。例如:
public IQueryable<Row> Action(string a, bool? b, int? c, string d)
{
var result = db.table.Where(e => true);
if (a != null)
result = result.Where(e => e.a == a);
if (b.HasValue)
result = result.Where(e => e.b == b.Value);
if (c.HasValue)
result = result.Where(e => e.c == c.Value);
if (d != null)
result = result.Where(e => e.d == d);
return result;
}
作为10+参数的解决方案,我可以建议如下:
public IQueryable<Row> Action()
{
var result = db.table.Where(e => true);
foreach(var parameter in HttpUtility.ParseQueryString(ActionContext.Request.RequestUri.Query).ToKeyValuePairs())
{
switch(parameter.Key)
{
case "a":
result = result.Where(e => e.a == parameter.Value);
break;
case "b":
result = result.Where(e => e.b == parameter.Value);
break;
...
}
}
return result;
}
或者检查所需参数的查询,并根据其值