我在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个月的学习!我知道!)
谢谢
答案 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}")]