如何在 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}")]
我正在使用 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}")]