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

How to add a new method to a controller in asp.net webAPI 2

我正在使用 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 将 return 该类别中的产品:

    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);
        });
}

我在控制器中添加了一个方法 class(我认为)可以处理这个问题:

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

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

谢谢

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

 api/{controller}/{id}

您还告诉我们您遇到了 NotFound 错误,我猜这是因为找不到 controller/method.

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

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

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

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

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

你的apilink应该是: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);
    });
}

可选: 如果你想 link 像这样:api/Product/Category/blabla 你必须添加这个:

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

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