如何创建ASP .NET MVC4 Web API来搜索我的多个参数

时间:2014-03-16 22:14:21

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing

如何创建ASP.NET MVC4 json Web API 允许按ID,条形码,搜索词或检索搜索产品 所有产品自发布之日起?

我尝试使用下面的ASP.NET MVC4控制器。

致电

http://localhost:52216/admin/api/Products/GetSince?since=2014-03-16%2021:47:29&_=1395007124964

返回错误

Multiple actions were found that match the request:

System.Net.Http.HttpResponseMessage GetSince(System.String) on type MyApp.Controllers.ProductsController\r\n


System.Net.Http.HttpResponseMessage GetId(System.String) on type MyApp.Controllers.ProductsController"

如何解决这个问题? 这段代码看起来很难看,它包含了许多类似的方法。 哪个是创建此类API的最佳方法? 如何改进这段代码? 应该使用Http GET方法,但方法名称和签名可以更改。

使用ASP.NET /Mono MVC4,jquery,jquery UI。还应支持Windows 2003服务器,因此无法使用.NET 4.5或MVC5。

public class ProductsController : ApiController
{
    [HttpGet]
    public HttpResponseMessage GetSince([FromUri]string since))
    {
        var toodelist = GetProducts(since, null, null, null);
        return Request.CreateResponse(HttpStatusCode.OK,
           new { products = toodelist.ToArray() });
    }

    [HttpGet]
    public HttpResponseMessage GetId([FromUri]string id)
    {
        var toodelist = GetProducts(null, null, id, null);
        return Request.CreateResponse(HttpStatusCode.OK,
           new { products = toodelist.ToArray() });
    }


    [HttpGet]
    public HttpResponseMessage GetBarcode([FromUri]string barcode)
    {
        var toodelist = GetProducts(null, barcode, null, null);
        return Request.CreateResponse(HttpStatusCode.OK,
           new { products = toodelist.ToArray() });
    }

    [HttpGet]
    public HttpResponseMessage GetTerm([FromUri]string term)
    {
        var toodelist = GetProducts(null, null, null, term);
        return Request.CreateResponse(HttpStatusCode.OK,
           new { products = toodelist.ToArray() });
    }

    static List<Product> GetProducts(string since, string barcode, string id, string term)
    {
        ... retrieves list of product from database using specified search criteria
        if not null
    }
}

1 个答案:

答案 0 :(得分:2)

如何使用这样的搜索条件DTO?

public class SearchCriteria
{
    public int? Id { get; set; }
    public DateTime? Since { get; set; }
    // Other properties
}

动作方法就是这样。

public class ProductsController : ApiController
{
    public HttpResponseMessage GetProducts([FromUri]SearchCriteria crit))
    {
        // Validate and clean crit object
        var list = GetProducts(crit);
        // return list
    }
}

GetProducts可以根据SearchCriteria对象中设置的属性返回产品列表。如果查询字符串字段不存在,则相应的属性将为null。