如何在asp.net webAPI 2中向控制器添加新方法

时间:2015-08-12 20:52:11

标签: asp.net-web-api asp.net-web-api2

我在www.asp.net上使用this教程来了解.net web api 2.我在索引页面上添加了第二个查找:

    <div>
    <h2>Search by Category</h2>
    <input type="text" id="catId" size="5" />
    <input type="button" value="Search" onclick="findCat();" />
    <p id="categories" />
</div>

并修改现有的javascript以添加类别查找。输入类别(例如,玩具)和API的想法将返回该类别中的产品:

    function findCat() {
    var uri = 'api/GetCategory';
    var cid = $('#catId').val();

    $.getJSON(uri + '/' + cid)
        .done(function (data) {
            $('#categories').text(formatItem(data));
        })
        .fail(function (jqXHR, textStatus, err) {
            $('#categories').text('Error: ' + err);
        });
}

我在控制器类中添加了一个方法(我认为)会处理这个:

        public IHttpActionResult GetCategory(string Category)
    {
        var product = products.FirstOrDefault((c) => c.Category == Category);
        if (product == null)
        {
            return NotFound();
        }
        return Ok(product);
    }

当我对类别进行搜索时,无法找到该类别中的产品。我错过了什么(除了大约6个月的学习!我知道!)

谢谢

1 个答案:

答案 0 :(得分:0)

通过阅读您的评论,您告诉我们您在路由配置中只有defaultApi,即:

 api/{controller}/{id}

您还告诉我们您收到NotFound错误,我想这是因为它无法找到控制器/方法。

通过阅读您的脚本,您实际上是这样做的:

    function findCat() {         //actual request URL:
    var uri = 'api/GetCategory'; //api/GetCategory/ 
    var cid = $('#catId').val(); 

    $.getJSON(uri + '/' + cid)  //api/GetCategory/1

您使用GetCategory作为控制器,这是不正确的,您的控制器是类名+控制器。所以在你的情况下可能是ProductController

其次,WebApi不会查找方法名称,只会在 HTTP请求类型参数中查找区别。因此,如果您有两个具有不同名称的方法,但它们都是GET请求类型且两者都有一个int作为参数,则Web Api不知道要使用哪个。

您的api链接应为:api/Product?category="blabla"

您可以做的是向方法添加其他路由,默认AccountController为此提供了很好的示例。

在你的情况下:

[RoutePrefix("api/Product")] //you have to specify this if you would like to do custom routing.
public class ProductController : ApiController
{
    //GET: api/Product/Category?category="blabla"
    [HttpGet]
    [Route("Category")] //route constraint
    public IHttpActionResult GetCategory(string category)
    {
        var product = products.FirstOrDefault((c) => c.Category == Category);
        if (product == null)
        {
            return NotFound();
        }
        return Ok(product);
    }

}

所以现在你可以更新你的脚本了,你的脚本是用Id来获取的,而你希望这是通过字符串,你可以想出来。我猜这样的事情(用javascript还没那么好。

function findCat() {
var uri = 'api/Product/Category';
var cid = $('#catName').valueOf();

$.getJSON(uri + '?category=' + cid)
    .done(function (data) {
        $('#categories').text(formatItem(data));
    })
    .fail(function (jqXHR, textStatus, err) {
        $('#categories').text('Error: ' + err);
    });
}

可选:如果您希望链接如下:api/Product/Category/blabla,您必须添加以下内容:

[Route("Category/{category}")]

Web API路由:article
属性路由和约束:article