C# 如何在Web API v2中使用参数?
我不知道从哪里开始。我之前问过一个问题,有人建议我看看属性路由。我仔细阅读了它,虽然它帮助我创建了下面的代码,但我仍然不知道如何像我想的那样限制它C# 如何在Web API v2中使用参数?,c#,asp.net-web-api,C#,Asp.net Web Api,我不知道从哪里开始。我之前问过一个问题,有人建议我看看属性路由。我仔细阅读了它,虽然它帮助我创建了下面的代码,但我仍然不知道如何像我想的那样限制它 public class ReviewController : ApiController { private Review db = new Review(); ////This GET works. It was auto-generated by Visual Studio. // GET: api/Review
public class ReviewController : ApiController
{
private Review db = new Review();
////This GET works. It was auto-generated by Visual Studio.
// GET: api/Review
public IQueryable<Review> GetReview()
{
return db.Review;
}
////This is the GET that I'm trying to write, but don't know what to do
// GET: api
[Route("api/review/site")]
[HttpGet]
public IEnumerable<Review> FindStoreBySite(int SiteID)
{
return db.Review
}
////This GET also works and was generated by VS.
// GET: api/Review/5
[ResponseType(typeof(Review))]
public IHttpActionResult GetReview(int id)
{
Review review = db.Review.Find(id);
if (review == null)
{
return NotFound();
}
return Ok(review);
}
下面是我得到的错误:
Multiple actions were found that match the request
当我用谷歌搜索它时,我会想到这个问题:
但是,我已经在那里尝试了答案(我已经确认我使用的是Web API V2,并且我的webapiconfig.cs文件包括config.maphttpAttribute();
行)
此外,正如您在我上面的代码中所看到的,我已经包含了适当的路由。但是,我仍然收到一个错误,告诉我它返回了两个冲突的API调用。如果您想获取get的参数,这就像一个简单的重载,但是如果完成了,POST将使用
[fromBody]
,因为URL位于标记[路线(“/abc/123/{id}”)]
例子
代码
返回
17
17
或
返回
17
17
如果您想获取get的参数,这就像一个简单的重载,但是如果完成了,POST将使用
[fromBody]
,因为URL位于标记[Route(“/abc/123/{id}”)]
例子
代码
返回
17
17
或
返回
17
17
要将参数传递给WebApi控制器,您需要向该控制器添加一个
[Route()]
属性,并用该{}
标记用作属性的链接部分
要返回仅与传入参数匹配的审阅,需要使用LINQ筛选数据
以下是一个例子:
[Route("api/getFoo/{id}")]
public IHttpActionResult GetFoo(int id)
{
return db.Foo.Where(x => x.Id == id);
}
字符串的{id}
部分表示将出现在浏览器url中的id:http://localhost:51361/api/getFoo/2
。url中的“2”是您在[Route(“api/getFoo/{id}”)属性中标记的{id}
属性
我还修改了您的代码:
public class ReviewController : ApiController
{
...
[Route("api/review/site/{siteId}")]
[HttpGet]
public IEnumerable<Review> FindStoreBySite(int SiteID)
{
return db.Review.Where(review => review.Id == SiteID);
}
...
公共类审阅控制器:ApiController
{
...
[路由(“api/review/site/{siteId}”)]
[HttpGet]
公共IEnumerable FindStoreBySite(int SiteID)
{
返回db.Review.Where(Review=>Review.Id==SiteID);
}
...
您的请求url应该如下所示:http://localhost:51361/api/review/site?SiteID=2
一开始你很难理解这一点,但最终你会习惯的。这是参数传递给控制器动作参数的方式。要将参数传递给WebApi控制器,你需要添加一个[Route()]
属性,并用此{}
标记用作属性的链接部分
要返回仅与传入参数匹配的审阅,需要使用LINQ筛选数据
以下是一个例子:
[Route("api/getFoo/{id}")]
public IHttpActionResult GetFoo(int id)
{
return db.Foo.Where(x => x.Id == id);
}
字符串的{id}
部分表示将出现在浏览器url中的id:http://localhost:51361/api/getFoo/2
。url中的“2”是您在[Route(“api/getFoo/{id}”)属性中标记的{id}
属性
我还修改了您的代码:
public class ReviewController : ApiController
{
...
[Route("api/review/site/{siteId}")]
[HttpGet]
public IEnumerable<Review> FindStoreBySite(int SiteID)
{
return db.Review.Where(review => review.Id == SiteID);
}
...
公共类审阅控制器:ApiController
{
...
[路由(“api/review/site/{siteId}”)]
[HttpGet]
公共IEnumerable FindStoreBySite(int SiteID)
{
返回db.Review.Where(Review=>Review.Id==SiteID);
}
...
您的请求url应该如下所示:http://localhost:51361/api/review/site?SiteID=2
一开始你很难理解这一点,但最终你会习惯的。这是参数如何传递给控制器操作参数的问题。对不起,你的答案我不太清楚。我应该在你的代码中添加什么内容,以便它知道在查看控制器中查看站点ID
匹配参数?抱歉,我不太清楚您的答案。我应该在您的代码中添加什么内容,以便它能够在Review
控制器中查看SiteID
与参数匹配的地方?是的,这正是我在示例代码中的内容。我只是不确定在中会出现什么内容{}
s。我有一个可以返回所有评论的API,还有一个可以根据评论ID限制评论的API。我正在努力让它根据SiteID
而不是“key”返回所有评论来自模型类。@phroureo我更新了我的答案。基本上,你需要使用LINQ来指定你只需要Id
属性等于传入的siteId
属性的评论。你可以通过执行db.reviews.Where(review=>review.Id==siteId)
谢谢!这就是我要找的。:)@Phrureo我很高兴听到这个消息。谢谢你的投票和选择的答案!好吧,我撒谎了。出于某种原因,../api/review/site?id=1
返回了与/api/review/1
相同的东西。它根本没有查看siteID
。好的,这正是我在示例代码中的内容。我只是不确定你的…
介于{}
之间。我有一个可以返回所有评论的API,还有一个可以根据评论ID限制评论的API。我正在努力让它根据SiteID
而不是“key”返回所有评论从模型类中。@phroureo我更新了我的答案。基本上,您需要使用LINQ来指定您只需要其Id
属性等于传入的siteId
属性的评论。您可以通过执行db.reviews.Where(review=>review.Id==siteId)来实现这一点
谢谢!这就是我要找的。:@phroureo我很高兴听到这个消息。谢谢你的投票和选择的答案!好吧,我撒谎了。出于某种原因,../api/review/site?id=1
返回的内容与/api/review/1
相同。它没有查看